Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android handler 詳解(面試百分之100問到),androidhandler

Android handler 詳解(面試百分之100問到),androidhandler

編輯:關於android開發

Android handler 詳解(面試百分之100問到),androidhandler


handler在Android中被稱為“消息處理者”,在多線程中比較常用。

handler內部實現原理


 

handler實現機制:
1,Message對象,表示要傳遞的一個消息,內部使用鏈表數據結構實現一個消息池,用於重復利用,
避免大量創建消息對象,造成內存浪費
2,MessageQueue對象,存放消息對象的消息隊列,先進先出原則
3,Looper對象負責管理當前線程的消息隊列
4,handler對象負責把消息push到消息隊列中,以及接收Looper從消息隊列中取出的消息


 

handler的內存洩露問題(activity已經退出,而handler沒有退出,這樣就可能導致內存洩露)
1,定義一個內部類時,會默認擁有外部類對象的引用,所以建議使用內部類時,最好定義一個靜態內部類
2,引用的強弱:強引用→軟引用→弱引用


 

下面用獲取網絡圖片代碼說明一下handler基本使用

package com.example.uri;

import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.MalformedURLException;
import java.net.URL;

import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;

/**
 * 
 * 訪問網絡的操作,必須放在工作線程中完成
 *
 */
public class MainActivity extends Activity {

    private static final int LOADSUCCESS=0x1;
    private static ImageView iv;
    private final myhandler handler=new myhandler(this);
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv=(ImageView) findViewById(R.id.imageView1);
    }

    private static class myhandler extends Handler{
        
        private final WeakReference<MainActivity> weakReference;
        public myhandler(MainActivity mainActivity){
            weakReference=new WeakReference<MainActivity>(mainActivity);
        }
        
        public void handleMessage(Message msg) {
            MainActivity mainActivity=weakReference.get();
            if(mainActivity!=null){
                switch (msg.what) {
                case LOADSUCCESS:
                    MainActivity.iv.setImageBitmap((Bitmap) msg.obj);
                    break;

                }
            }
        }
    }
    public void geturl(View v){
        /*Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
        startActivity(intent);  */
        new Thread(new Runnable() {
            
            @Override
            public void run() {
                try {
                    URL url=new URL("http://img2.3lian.com/img2007/10/28/123.jpg");
                    InputStream in=url.openStream();
                    Bitmap bitmap=BitmapFactory.decodeStream(in);
                    Message message= handler.obtainMessage(LOADSUCCESS, bitmap);
                    handler.sendMessage(message);
                } catch (MalformedURLException e) {
                    // TODO 自動生成的 catch 塊
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO 自動生成的 catch 塊
                    e.printStackTrace();
                }
            }
        }).start();
        
    }

}

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved