android執行緒間通訊的四種實現方式
阿新 • • 發佈:2019-01-30
1,通過Handler機制.
主執行緒中定義Handler,子執行緒發訊息,通知Handler完成UI更新,Handler物件必須定義在主執行緒中,如果是多個類直接互相呼叫,就不是很方便,需要傳遞content物件或通過介面呼叫。另外Handler機制與Activity生命週期不一致的原因,容易導致記憶體洩漏,不推薦使用。private void one() { handler=new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 123: tv.setText(""+msg.obj); break; } } }; new Thread(){ @Override public void run() { super.run(); for (int i=0;i<3;i++){ try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } Message message=new Message(); message.what=123; message.obj="通過Handler機制"; handler.sendMessage(message); } }.run(); }
2,runOnUiThread方法
用Activity物件的runOnUiThread方法更新,在子執行緒中通過runOnUiThread()方法更新UI,強烈推薦使用。private void two(){ new Thread(){ @Override public void run() { super.run(); for (int i=0;i<3;i++){ try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } runOnUiThread(new Runnable() { @Override public void run() { tv.setText("通過runOnUiThread方法"); } }); } }.run(); }
3,View.post(Runnable r) 、
這種方法更簡單,但需要傳遞要更新的View過去,推薦使用private void three(){ new Thread(){ @Override public void run() { super.run(); for (int i=0;i<3;i++){ try { sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } tv.post(new Runnable() { @Override public void run() { tv.setText("通過View.post(Runnable r) 方法"); } }); } }.run(); }
4,AsyncTask
private void four(){
new MyAsyncTask().execute("通過AsyncTask方法");
}
private class MyAsyncTask extends AsyncTask{
@Override
protected Object doInBackground(Object[] objects) {
for (int i=0;i<3;i++){
try {
sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return objects[0].toString();
}
@Override
protected void onPostExecute(Object o) {
super.onPostExecute(o);
tv.setText(o.toString());
}
}