【问题标题】:Why Context can't be used in doInBackground() of AsyncTask为什么在 AsyncTask 的 doInBackground() 中不能使用 Context
【发布时间】:2013-09-24 07:37:48
【问题描述】:

我只是发现doInBackground() 中不使用上下文背后的事实。事实上,我们不能直接更新 doInBackground() 中的 UI,要更新 doInBackground() 中的 UI,我们必须通过负责调用 onProgressUpdate()publishProgress() 方法调用其他线程。
所以简而言之,我只想知道UI threadAsyncTask 之间的化学反应是什么,以及为什么 AsyncTask 在 UI 线程中执行。

【问题讨论】:

  • 如果任何答案有用,请标记为已接受

标签: android multithreading android-asynctask android-context


【解决方案1】:

AsyncTask 允许正确且轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。

AsyncTask 被设计成一个围绕 Thread 和 Handler 的辅助类,并不构成一个通用的线程框架。 AsyncTasks 最好用于短时间的操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 API,例如Executor、ThreadPoolExecutor 和 FutureTask。

异步任务由在后台线程上运行的计算定义,其结果在 UI 线程上发布。异步任务由 3 种通用类型定义,称为 Params、Progress 和 Result,以及 4 个步骤,称为 onPreExecute、doInBackground、onProgressUpdate 和 onPostExecute。

有关使用任务和线程的更多信息,请阅读 Processes and Threads 开发者指南。

【讨论】:

    【解决方案2】:

    Q 为什么AsyncTask的doInBackground()中不能使用Context?

    上下文顾名思义,它是应用程序/对象当前状态的上下文。它让新创建的对象了解正在发生的事情。通常,您调用它是为了获取有关程序另一部分(活动、包/应用程序)的信息

    当 doInBackground() 在doInBackground() 中时,它没有关系/(上下文)或与当前 Activity 无关。您无权访问主线程。它完全是一个新的活动,即使你的主线程/活动已经停止工作,它也会执行它的任务。

    AsyncTask 不在主线程或您用来调用它的主 UI 线程上运行。它在单独的线程上运行以执行分配给它的任务

    要在 AsycTask 完成后对 UI 进行更改,您必须调用

      protected void onPostExecute(String string) 
        { 
             Toast c=Toast.makeText(getApplicationContext(), string,  Toast.LENGTH_LONG);
                c.show();
    
              }
    

    所有 UI 更改都可以在 protected void onPostExecute()

    中完成

    简而言之 doInBackground() 不能对您的主线程进行任何更改,并且不依赖于您的主 UI/线程,因此在 doInBackground() 中使用上下文是没有问题的

    Q 为什么我们可以在 onPreExecute() 和 onPostExecute() 中使用上下文?

    AsycTask 有

    1.onPreExecute() 创建新线程之前/之前(可以对主线程进行更改)

    onPreExecute() 具有主线程的上下文 / AsycTask 仍在主线程中

    2.doInBackground() 创建了一个自己的新线程来执行给定的任务。一旦进入这个状态/线程,在它完成之前你不能做任何事情。

    doInBackground() 没有上下文。新线程是自己创建的。一旦创建了新线程,它就会完成给定的任务,而不管主线程是否被杀死/停止。/新线程中的 AsycTask。

    3.onPostExecute()- doInBackground() 完成任务后调用 onPostExecute() 以便主线程可以使用计算结果

    onPostExecute() 在主线程中有主线程 /AsycTask 的上下文。

    【讨论】:

    • 我知道如何在 AsycTask 中使用 cantext,但我想知道为什么我们不能在 doInBackground 中使用上下文
    • 当你回答一个新的答案时,为什么我们可以在 onPreExecute() 和 onPostExecute() 中使用上下文。这两个方法也是工作线程(活动)的其他线程(AsycTask)的一部分
    • 但是你可以使用 doInBackground() 中的上下文来获得这样的共享首选项:stackoverflow.com/a/14053548/382115
    【解决方案3】:

    我们可以在 doinbackground 方法中使用上下文,但只能从 ui 组件中获取值。我们不能使用 contexr 在 ui 组件中设置值

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-20
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多