Lit*_*ild 5 concurrency android ui-thread android-asynctask
我是初学者Android,我有一些困惑Android UI Thread.现在,我知道除了创建UI的线程之外没有任何线程可以修改它.
大.
这是Activity我的第一个Android应用程序,有点让我感到困惑.
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);
}
//------------------------------------------------------------------------------
}
Run Code Online (Sandbox Code Playgroud)
onCreate在UI线程上,所以我可以做任何我想做但onClick不是.为什么我可以使用该方法制作a ProgressDialog和a Toast?为什么没有错误?AsyncTask是的子类NasaDailyImage.这意味着它可以访问包括更新显示的所有方法.在与UI不同的线程上运行的调用.那么,为什么我可以在那里更新显示但却没有错误?NasaDailyImageresetDisplay()resetDisplay()onPostExecute
onClick()确实是在UI线程上。Activity 中发生的大部分事情都发生在 UI 线程上。
onPostExecte()(及其对应项onPreExecute())也运行在 UI 线程上。文档清楚地说明AsyncTask.onPostExecte()了这一点。AsyncTask 经过精心设计,以便开发人员可以在执行后台工作之前和之后更新 UI。
一般来说,除非您明确告知,否则您的代码将在 UI 线程上运行。创建 AsyncTasks、Runnables 或 Threads 后,您需要确保了解代码的执行位置。在 Activity 中,通常可以安全地假设您位于 UI 线程上。
| 归档时间: |
|
| 查看次数: |
831 次 |
| 最近记录: |