[以請求服務器數據爲例]Android Message機制實現主線程、子線程數據傳遞

主線程代碼

private Handler handler = new Handler(){
        @Override
        public void handleMessage(@NonNull Message msg) {
            super.handleMessage(msg);
            if(msg.what == 0x200){ 	
                //主線程操作

            }
        }
 };

:msg.what 可以在創建message時自定義,用來區分message的類型

子線程代碼:請求服務器數據爲例

	  final FormBody body = bodyBuilder.add("classification","year/month/day").build();
      new Thread(new Runnable() {
      		@Override
      		public void run() {
         		 try {
            		//post 方式 進行數據請求
            		Response response = HttpUtil.doPost(url,body);
             		//獲取響應中的JSON字符串
             		String str = response.body().string();
			 		recordList = JSONUtil.getRecordList(str);   /*解析JSON字符串,獲得記錄鏈表*/
					
					Message msg = Message.obtain();/*創建Message*/
            		msg.what = 0x200;           /*設定msg.what -> 消息類型*/
            		msg.obj = recordList;       /* msg.obj -> 消息攜帶的數據*/
            		handler.sendMessage(msg);   /*發送給主線程的handler 進行相應處理*/
        		} catch (IOException e) {
            		e.printStackTrace();
         		}
			}
		}).start();

在子線程的代碼中,網絡請求的代碼跟主旨無關,暫且不管。Message機制中,子線程通過Message.obtain()的方法從MessagePool中獲取一個消息對象,程序員可以對這個對象進行<what(消息類型) , obj(消息攜帶的數據)>的賦值,從而可以實現將數據從子線程傳遞到主線程。

主線程通過判斷 msg.what 值的類型 在__主線程__中進行不同的操作。

好了,本次博客到此爲止。希望大家能夠學有所得!

另:轉發或轉載請註明出處,謝謝合作!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章