首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解UI线程

理解UI线程
EN

Stack Overflow用户
提问于 2013-07-24 19:06:45
回答 2查看 1.1K关注 0票数 5

我是Android的初学者,我对Android UI Thread有一些困惑。现在,我知道除了创建UI的线程之外,没有任何线程可以修改它。

太棒了。

这是我第一个安卓应用程序的Activity,它让我有点困惑。

代码语言:javascript
复制
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 和?为什么没有错误?

  1. AsyncTaskNasaDailyImage的子类。这意味着它可以访问所有的NasaDailyImage的方法,包括更新显示的resetDisplay()resetDisplay()在运行在与UI不同的线程上的onPostExecute中被调用。那么,为什么我可以在那里更新显示而又没有错误呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-07-24 19:13:08

  1. onClick()确实在UI线程上。在一个活动中发生的大多数事情都发生在UI线程上。
  2. onPostExecte() (及其对应的onPreExecute())也运行在UI线程上。 documentation清楚地说明了这一点。AsyncTask是故意设计的,这样开发人员就可以在做后台工作之前和之后更新UI。

通常,除非您显式地告诉UI线程,否则您的代码将在UI线程上运行。一旦创建了AsyncTasks、Runnable或线程,就需要确保您了解代码的执行位置。在活动中,假设您处于UI线程中通常是安全的。

票数 3
EN

Stack Overflow用户

发布于 2013-07-24 19:22:29

  1. 您正在扩展AsyncTask类,其中异步任务类将自动调用其顺序方法。首先是onPreExecute,然后是doBackground,最后是onPost。如果要更改任何ui更改,可以使用onProgressUpdate方法。
  2. 要使用活动类,只需调用activityclass.this.resetDisplay()。因为内部类作用域有时无法集成,除了全局varible。

谢谢

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17842747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档