【问题标题】:Understanding the UI thread了解 UI 线程
【发布时间】:2013-07-24 10:40:18
【问题描述】:

我是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 不同的线程上运行。那么,为什么我可以在那里更新显示却没有错误?

【问题讨论】:

  • onClickonPostExecute 都在 UI 线程上运行。您的代码中唯一没有的是doInBackground,顾名思义,它在后台线程上运行。
  • @Geobits AFAIK,这与在 不同线程 上处理事件的旧 Java 不同,对吗? UI 是一个线程,事件处理在另一个线程上
  • 在 Android 中,一切都在 UI 线程中运行,除非您创建线程或使用使用线程的框架类。

标签: android concurrency android-asynctask ui-thread


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

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

谢谢

【讨论】:

    【解决方案2】:
    1. onClick() 确实在 UI 线程上。 Activity 中发生的大部分事情都发生在 UI 线程上。

    2. onPostExecte()(及其对应的onPreExecute())也在 UI 线程上运行。 AsyncTask.onPostExecte() documentation 明确说明了这一点。特意设计了 AsyncTask,以便开发人员可以在执行后台工作之前和之后更新 UI。

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

    【讨论】:

    • AFAIK,这与在不同线程上处理事件的旧 Java 不同,对吧? UI 是一个线程,事件处理在另一个线程上
    • “旧 Java”和“事件”是什么意思?如果您阅读 Android 的源代码,所有onClick()“事件”都是接口中的方法。活动并没有什么特别之处。
    • 我的意思是 addActionListener 是在不同的线程上处理的,对吧?
    • ActionListener 是 Java AWT 包的一部分。在大多数桌面 Java 应用程序中发现的 AWT、Swing 和类似的常见 UI 相关包在 Android 中不存在。我对ActionListener 或者它处理事件的方法不是很熟悉,但它在Android 中没有使用。 Android中没有addActionListener()
    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-15
    • 2012-10-07
    相关资源
    最近更新 更多