子线程更新主线程UI操做的几种方法:java
//定义handler static final int SUCCESS = 1; static final int FAIL = 0; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case SUCCESS: Toast.makeText(MyActivity.this, msg.getData().get("msg").toString(), Toast.LENGTH_SHORT).show(); break; case FAIL: Toast.makeText(MyActivity.this, msg.getData().get("msg").toString(), Toast.LENGTH_SHORT).show(); break; default: super.handleMessage(msg); } } }; //方法一:经过handler.sendMessage,更新UI主线程 private void makeToastByHandlerSendMessage(String msgStr) { Message msg = new Message(); msg.what = 0; Bundle bundle = new Bundle(); bundle.putString("msg", msgStr); msg.setData(bundle); handler.sendMessage(msg); } //方法二:经过handler.post,更新UI主线程 private void makeToastByHandlerPost(final String msg) { handler.post(new Runnable() { @Override public void run() { Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show(); } }); } //方法三:经过handler.post,延迟seconds秒后更新UI主线程 private void makeToastByHandlerPostDelay(final String msg, int seconds) { handler.postDelayed(new Runnable() { @Override public void run() { Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show(); } }, seconds * 1000); } //方法四:使用runOnUiThread,更新UI主线程 private void makeToastByRunOnUiThread(final String msg) { MyActivity.this.runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show(); } }); } //方法五:经过view.post,更新UI主线程 private void makeToatByViewPost(View view, final String msg) { view.post(new Runnable() { @Override public void run() { Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show(); } }); } //方法六:经过AsyncTask,更新UI主线程 private void makeToastByAysncTask(final String msg) { AsyncTask asyncTask = new AsyncTask() { @Override protected Object doInBackground(Object[] params) { return null; } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); Toast.makeText(MyActivity.this, msg, Toast.LENGTH_SHORT).show(); } @Override protected void onProgressUpdate(Object[] values) { super.onProgressUpdate(values); } }; asyncTask.execute(); }
使用方法: async
//一、Handler.SendMessage makeToastByHandlerSendMessage(msg); //二、Handler.Post makeToastByHandlerPost(msg); //三、Handler.PostDelay makeToastByHandlerPostDelay(msg,1); //四、context.RunOnUiThread makeToastByRunOnUiThread(msg); //五、View.Post makeToatByViewPost(btnLogin,msg); //六、AysncTask makeToastByAysncTask(msg);
其实经过查看源代码,发现非handler的实现方法最终仍是经过handler来实现的。ide
MyActivity.this.runOnUiThread(new Runnable() { }); view.post(new Runnable()); // 以上两个方法最终都调用handler的sendMessageDelayed方法 public final boolean sendMessageDelayed(Message msg, long delayMillis)