安卓學習之路之Handler的簡單實用

1.Handler,也就是處理者的意思,主要用於發送和處理消息的,發送消息一般是使用Handler的Handler.sendMessage()的 方法,來發送消息 消息的隊列是先進先出的順序.

2.Message 消息的封裝者,把異步任務 等封裝成Message的對象;

3.Messagequeue 消息隊列,用於保存當前線程所有的message對象;

4. looper 巡視者,一直查詢消息隊列裏是否有消息,有消息的通知handler處理數據,沒有消息就阻塞,等到有消息的時候

5.Thread :線程,異步任務或者耗時的任務,一般開啓一個新的工作線程處理耗時任務 

首先handler對象發送消息,最後到handlerMessage()的方法 處理髮送過來的消息,具體的代碼如下

  new Thread() {

            @Override
            public void run() {
                String path = "https://ss0.bdstatic.com/5aV1bjqh_Q23odCf/static/superplus/img/logo_white_ee663702.png";
                try {
                    URL mUrl = new URL(path);
                    HttpURLConnection conn= (HttpURLConnection) mUrl.openConnection();

                    conn.setRequestMethod("GET");
                    conn.setConnectTimeout(5000);
                    conn.setReadTimeout(5000);
                    conn.connect();
                    if (conn.getResponseCode() == 200) {
                        InputStream inputStream = conn.getInputStream();
                        Log.e("cc", "inputstream" + inputStream.toString());
                        Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                        Message message = Message.obtain();
                        message.obj = bitmap;
                        message.what = 1;
                        mhandHandler.sendMessage(message);
                    }

                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }.start();
首先我開啓一個新的線程去做網絡的異步下載,得到後的數據,bitmap對象,

message.obj=bitmap;把bitmap的對象封裝到message裏面.

然後通過Handler的對象發送消息

public  class MainActivity extends AppCompatActivity {
    private ImageView image;
    private  InputStream is;

    private Handler mhandHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
//                is = (InputStream) msg.obj;
//                Bitmap bitmap = BitmapFactory.decodeStream(is);

                   Bitmap bitmap = (Bitmap) msg.obj;
                image.setImageBitmap(bitmap);
                Log.e("cc", "is" + is.toString());
            }

        }
    };
發送過來的消息,在ui線程裏,直接更新ui

有一點需要注意的是,android在創建UI線程的時候,已經把Looper的對象生成過了,

但是你自己創建線程的話,就需要手動創建一個Looper對象的實例了 ,具體的代碼如下;

public class MainActivity extends Activity {
	
	private Handler handler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	//開啓子線程
	public void start(View v){
		new MyThread().start();
	}
	
	//=向子線程發送消息
	public void send(View v){
		Message msg = Message.obtain();
		msg.what = 100;
		msg.obj ="AAAAAAAAA";
		handler.sendMessage(msg);
	}
	
	public class MyThread extends Thread{
		@Override
		public void run() {
			// TODO Auto-generated method stub
			super.run();
			Looper.prepare();
			handler = new Handler(){
				@Override
				public void handleMessage(Message msg) {
					// TODO Auto-generated method stub
					super.handleMessage(msg);
					
					String str = (String) msg.obj;
					int flag = msg.what;
					Log.i("===MSG===", "==str="+str+"==flag=="+flag);
					
				}
			};
		Looper.loop();
		}
	}
</pre>這裏如果沒有Looper.prepare();方法的話,會直接包如下的錯誤<p></p><p><span style="font-size:18px"></span></p><pre name="code" class="java">java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
具體的意思就是,不能再Looper.prepare()方法之前創建一個Handler的實例;

 還有如果沒有Looper.Loop();方法的話,Looper的對象是不會工作,也就是不會循環的查詢消息隊列是否有消息的,只有調用這個方法 Looper才能工作的





發佈了41 篇原創文章 · 獲贊 6 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章