Android基础知识:在UI线程中运行代码
在UI线程中运行代码的观点,有没有区别:
MainActivity.this.runOnUiThread(new Runnable() { public void run() { Log.d("UI thread", "I am the UI thread"); } });
要么
MainActivity.this.myView.post(new Runnable() { public void run() { Log.d("UI thread", "I am the UI thread"); } });
和
private class BackgroundTask extends AsyncTask<String, Void, Bitmap> { protected void onPostExecute(Bitmap result) { Log.d("UI thread", "I am the UI thread"); } }
没有一个是完全一样的,尽pipe它们都具有相同的净效应。
第一个和第二个之间的区别在于,如果您在执行代码时碰巧在主应用程序线程上,第一个( runOnUiThread()
)将立即执行Runnable
。 第二个( post()
)总是将Runnable
放在事件队列的末尾,即使您已经在主应用程序线程中。
第三个假设你创build和执行一个BackgroundTask
实例,将浪费大量的时间从一个线程池中取出一个线程,执行一个默认的no-op doInBackground()
,最后做一个post()
。 这是三者中效率最低的。 使用AsyncTask
如果你真的有工作在后台线程,而不只是使用onPostExecute()
。
我喜欢HPP的评论 ,它可以在任何地方使用,没有任何参数:
new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { Log.d("UI thread", "I am the UI thread"); } });
处理程序有第四种方法
new Handler().post(new Runnable() { @Override public void run() { // Code here will run in UI thread } });
Pomber的答案是可以接受的,但我并不是反复创build新对象的忠实粉丝。 最好的解决scheme总是试图缓解记忆猪。 是的,有自动垃圾收集,但在移动设备的记忆保存属于最佳做法的范围内。 下面的代码更新服务中的TextView。
TextViewUpdater textViewUpdater = new TextViewUpdater(); Handler textViewUpdaterHandler = new Handler(Looper.getMainLooper()); private class TextViewUpdater implements Runnable{ private String txt; @Override public void run() { searchResultTextView.setText(txt); } public void setText(String txt){ this.txt = txt; } }
它可以从这样的任何地方使用:
textViewUpdater.setText("Hello"); textViewUpdaterHandler.post(textViewUpdater);