Android子线程中更新UI的4种方法
生活随笔
收集整理的這篇文章主要介紹了
Android子线程中更新UI的4种方法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
方法一:用Handler
1、主線程中定義Handler:?
Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: //完成主界面更新,拿到數據 String data = (String)msg.obj; updateWeather(); textView.setText(data); break; default: break; } } };2、子線程發消息,通知Handler完成UI更新:?
private void updateWeather() {new Thread(new Runnable(){ @Override public void run() { //耗時操作,完成之后發送消息給Handler,完成UI更新; mHandler.sendEmptyMessage(0); //需要數據傳遞,用下面方法; Message msg =new Message(); msg.obj = "數據";//可以是基本類型,可以是對象,可以是List、map等; mHandler.sendMessage(msg); } }).start(); }
方法一的Handler對象必須定義在主線程中,如果是多個類直接互相調用,就不是很方便,需要傳遞content對象或通過接口調用;?
方法二:用Activity對象的runOnUiThread方法更新?
在子線程中通過runOnUiThread()方法更新UI:?
new Thread() { public void run() { //這兒是耗時操作,完成之后更新UI; runOnUiThread(new Runnable(){@Override public void run() { //更新UI imageView.setImageBitmap(bitmap); } }); } }.start();
如果在非上下文類中(Activity),可以通過傳遞上下文實現調用;?
Activity activity = (Activity) imageView.getContext(); activity.runOnUiThread(new Runnable() { @Override public void run() { imageView.setImageBitmap(bitmap); } }); 這種方法使用比較靈活,但如果Thread定義在其他地方,需要傳遞Activity對象;?
方法三:View.post(Runnable r)?
這種方法更簡單,但需要傳遞要更新的View過去;?
?
方法四:AsyncTask
//UI線程中執行 new DownloadImageTask().execute( "www.91dota.com" ); private class DownloadImageTask extends AsyncTask { protected String doInBackground( String... url ) { return loadDataFormNetwork( url[0] );//后臺耗時操作 } protected void onPostExecute( String result ) { myText.setText( result ); //得到來自網絡的信息刷新頁面 } }總結:
1、其實上面的四種方式都可歸結于一種方式:handler 用于Android線程之間的通信。
2、為什么android要求只能在UI線程進行UI操作? 主要還是為了避免多線程造成的并發的問題。在單線程操作UI是安全的。
轉載于:https://www.cnblogs.com/DreamRecorder/p/9138260.html
總結
以上是生活随笔為你收集整理的Android子线程中更新UI的4种方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ExtJs6解决添加和修改Form共用一
- 下一篇: JSP中传值事件