java 總結4種執行緒中操作UI介面的方法
阿新 • • 發佈:2019-02-18
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. }