4

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

4

3 回答 3

5

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

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

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

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 的上下文。

于 2013-09-19T09:29:43.293 回答
1

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

于 2014-04-11T12:18:39.333 回答
0

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

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

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

有关使用任务和线程的更多信息,请阅读进程和线程开发人员指南。

于 2013-09-19T09:29:34.430 回答