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);