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


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();
        
    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM