我是Android的初学者,我对Android UI Thread有一些困惑。现在,我知道除了创建UI的线程之外,没有任何线程可以修改它。
太棒了。
这是我第一个安卓应用程序的Activity,它让我有点困惑。
public class NasaDailyImage extends Activity{
public ProgressDialog modalDialog = null;
//------------------------------------------------------------------------------
@Override
protected void onCreate(Bundle savedInstanceState){
//Instantiate progress dialog, skipping details.
Button b = //get reference to button
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
modalDialog.show(); // show modal
Toast.makeText(getApplicationContext(), "Getting feeds", 500).show();
new AsyncRetriever().execute(new IotdHandler()); // Get the feeds !!
}
});
}
//------------------------------------------------------------------------------
public synchronized void resetDisplay(boolean parseErrorOccured,
boolean imageErrorOccured,
IotdHandler newFeeds){
if(parseErrorOccured || imageErrorOccured){
// make a Toast
// do not update display
}else{
// make a Toast
// update display
// based on new feed
}
}
//------------------------------------------------------------------------------
class AsyncRetriever extends AsyncTask<IotdHandler,Void,IotdHandler>{
@Override
protected IotdHandler doInBackground(IotdHandler... arg0) {
IotdHandler handler = arg0[0];
handler.processFeed(); // get the RSS feed data !
return handler;
}
//------------------------------------------------------------------------------
@Override
protected void onPostExecute(IotdHandler fromInBackground){
resetDisplay( // call to update the display
fromInBackground.errorOccured,
fromInBackground.imageError,
fromInBackground);
}
//------------------------------------------------------------------------------
}
onCreate在UI线程上,所以我可以做我想做的任何事情,但是onClick不是。为什么我可以用这种方法制作一个ProgressDialog Toast 和?为什么没有错误?AsyncTask是NasaDailyImage的子类。这意味着它可以访问所有的,NasaDailyImage的方法,包括更新显示的resetDisplay()。resetDisplay()在运行在与UI不同的线程上的onPostExecute中被调用。那么,为什么我可以在那里更新显示而又没有错误呢?
发布于 2013-07-24 19:13:08
onClick()确实在UI线程上。在一个活动中发生的大多数事情都发生在UI线程上。onPostExecte() (及其对应的onPreExecute())也运行在UI线程上。 documentation清楚地说明了这一点。AsyncTask是故意设计的,这样开发人员就可以在做后台工作之前和之后更新UI。通常,除非您显式地告诉UI线程,否则您的代码将在UI线程上运行。一旦创建了AsyncTasks、Runnable或线程,就需要确保您了解代码的执行位置。在活动中,假设您处于UI线程中通常是安全的。
发布于 2013-07-24 19:22:29
onPreExecute,然后是doBackground,最后是onPost。如果要更改任何ui更改,可以使用onProgressUpdate方法。activityclass.this.resetDisplay()。因为内部类作用域有时无法集成,除了全局varible。谢谢
https://stackoverflow.com/questions/17842747
复制相似问题