了解UI线程

时间:2013-07-24 19:06:46

标签: android concurrency android-asynctask ui-thread

我是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不是。 为什么我可以在该方法中制作ProgressDialogToast为什么没有错误?
2. AsyncTaskNasaDailyImage的子类。这意味着它可以访问所有 NasaDailyImage的方法,包括更新显示的resetDisplay()。在resetDisplay()中调用onPostExecute,它在与UI不同的线程上运行。那么,为什么我可以在那里更新显示但没有错误?

2 个答案:

答案 0 :(得分:3)

  1. onClick()确实在UI线程上。活动中发生的大多数事情发生在UI线程上。

  2. onPostExecte()(及其对应的onPreExecute())也在UI线程上运行。 AsyncTask.onPostExecte() documentation清楚地说明了这一点。 AsyncTask是经过精心设计的,开发人员可以在后台工作之前和之后更新UI。

  3. 通常,除非您明确说明,否则您的代码将在UI线程上运行。创建AsyncTasks,Runnables或Threads后,您需要确保了解代码的执行位置。在Activity中,假设您在UI线程上通常是安全的。

答案 1 :(得分:0)

  1. 您正在扩展AsyncTask类,其中异步任务类自动调用其顺序方法。先是onPreExecute,然后是doBackground,最后是onPost。如果要更改任何ui更改,可以使用onProgressUpdate方法。

  2. 要使用您的活动类简单调用activityclass.this.resetDisplay()。因为除了全局变量之外,内部类范围有时无法集成。

  3. 由于