1. 程式人生 > >java 總結4種執行緒中操作UI介面的方法

java 總結4種執行緒中操作UI介面的方法

 private class LoadTask extends AsyncTask {
     protected String doInBackground( String... url ) {
          return loadDataFormNetwork( url[0] );//後臺耗時操作
     }

     protected void onPostExecute( String result ) {
           myText.setText( result ); //得到來自網路的資訊重新整理頁面 

    }
我們經常會在後臺執行緒中去做一些耗時的操作,比如去網路取資料。但是當資料取回來,需要顯示到頁面上的時候,會遇到一些小麻煩,因為我們都知道,android的UI頁面是不允許在其他執行緒直接操作的。下面總結4中方法用來線上程中操作UI介面。

方法一:Handler

子執行緒呼叫Handler的sendMessage(message)傳送事件。



Java程式碼 複製程式碼 收藏程式碼
1.mHandler = new Handler() {  
2.   @Override  
3.   public void handleMessage(Message msg) {  
4.        //操作介面  
5.       myText.setText( 來自網路的資訊);  
6.      super.handleMessage(msg);  
7.   }  
8.  };  
mHandler = new Handler() {
   @Override
   public void handleMessage(Message msg) {
        //操作介面
       myText.setText( 來自網路的資訊);
      super.handleMessage(msg);
   }
  };

 



Java程式碼 複製程式碼 收藏程式碼
1.public class MyThread extends Thread {  
2.     public void run() {  
3.​    ​    ​    // 耗時操作  
4.​    ​    ​    ​loadNetWork();  
5.            Message msg = new Message();  
6.            mHandler.sendMessage(msg);//向Handler傳送訊息,  
7.      }  
8. }  
public class MyThread extends Thread {
     public void run() {
​    ​    ​    // 耗時操作
​    ​    ​    ​loadNetWork();
            Message msg = new Message();
            mHandler.sendMessage(msg);//向Handler傳送訊息,
      }
 }


方法二:View.post(Runnable )



Java程式碼 複製程式碼 收藏程式碼
1.public void onClick( View v ) {  
2.        new Thread( new Runnable() {  
3.                public void run() {  
4.                       // 耗時操作  
5.​    ​    ​    ​    ​    ​      loadNetWork();  
6.​                          myText<span style="color: rgb(255, 0, 0); white-space: normal;">.post</span>( new Runnable() {  
public void onClick( View v ) {
        new Thread( new Runnable() {
                public void run() {
                       // 耗時操作
​    ​    ​    ​    ​    ​      loadNetWork();
​                          myText.post( new Runnable() {



Java程式碼 複製程式碼 收藏程式碼
1.                                  myText.setText( 來自網路的資訊);  
2.                          });  
3.                 }  
4.        }).start();  
5.}  
                                  myText.setText( 來自網路的資訊);
                          });
                 }
        }).start();
}


方法三:Activity.runOnUiThread(Runnable )

與view.post類似



Java程式碼 複製程式碼 收藏程式碼
1.public void onClick( View v ) {  
2.        new Thread( new Runnable() {  
3.                public void run() {  
4.                       // 耗時操作  
5.​    ​    ​    ​    ​    ​      loadNetWork();  
6.​                         Activity.runOnUiThread.( new Runnable() {  
7.                                  myText.setText( 來自網路的資訊);  
8.                          });  
9.                 }  
10.        }).start();  
11.}  
public void onClick( View v ) {
        new Thread( new Runnable() {
                public void run() {
                       // 耗時操作
​    ​    ​    ​    ​    ​      loadNetWork();
​                         Activity.runOnUiThread.( new Runnable() {
                                  myText.setText( 來自網路的資訊);
                          });
                 }
        }).start();
}


方法四:AsyncTask

​ 



Java程式碼 複製程式碼 收藏程式碼
1.//UI執行緒中執行  
2.new DownloadImageTask().execute( "www.91dota.com" );  
 //UI執行緒中執行
 new DownloadImageTask().execute( "www.91dota.com" );

 



Java程式碼 複製程式碼 收藏程式碼
1.private class LoadTask extends AsyncTask {  
2.    protected String doInBackground( String... url ) {  
3.         return loadDataFormNetwork( url[0] );//後臺耗時操作  
4.    }  
5.  
6.    protected void onPostExecute( String result ) {  
7.          myText.setText( result ); //得到來自網路的資訊重新整理頁面   
8.  
9.   }