我是Android
的初学者,我对Android UI Thread
有些疑惑。现在,我知道除了创建UI的线程之外没有任何线程可以修改它。
大。
以下是我的第一个Android应用中的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);
}
//------------------------------------------------------------------------------
}
<小时/> 1.
onCreate
在UI线程上,所以我可以做任何我想做的事,但onClick
不是。 为什么我可以在该方法中制作ProgressDialog
和Toast
?为什么没有错误?AsyncTask
是NasaDailyImage
的子类。这意味着它可以访问所有 NasaDailyImage
的方法,包括更新显示的resetDisplay()
。在resetDisplay()
中调用onPostExecute
,它在与UI不同的线程上运行。那么,为什么我可以在那里更新显示但没有错误?
答案 0 :(得分:3)
onClick()
确实在UI线程上。活动中发生的大多数事情发生在UI线程上。
onPostExecte()
(及其对应的onPreExecute()
)也在UI线程上运行。 AsyncTask.onPostExecte()
documentation清楚地说明了这一点。 AsyncTask是经过精心设计的,开发人员可以在后台工作之前和之后更新UI。
通常,除非您明确说明,否则您的代码将在UI线程上运行。创建AsyncTasks,Runnables或Threads后,您需要确保了解代码的执行位置。在Activity中,假设您在UI线程上通常是安全的。
答案 1 :(得分:0)
您正在扩展AsyncTask类,其中异步任务类自动调用其顺序方法。先是onPreExecute
,然后是doBackground
,最后是onPost
。如果要更改任何ui更改,可以使用onProgressUpdate
方法。
要使用您的活动类简单调用activityclass.this.resetDisplay()
。因为除了全局变量之外,内部类范围有时无法集成。
由于