我只是发现不使用 Context insidedoInBackground()
背后的事实是什么。事实上,我们不能直接更新 doInBackground() 中的 UI,要更新 doInBackground() 中的 UI,我们必须通过publishProgress()
负责调用的方法调用其他线程onProgressUpdate()
。
所以简而言之,我只想知道UI thread
和之间的化学反应是什么AsyncTask
,以及为什么 AsyncTask 在 UI 线程中执行。
3 回答
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 的上下文。
我们可以在 doinbackground 方法中使用上下文,但只能从 ui 组件中获取值。我们不能使用 contexr 在 ui 组件中设置值</p>
AsyncTask 允许正确和轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。
AsyncTask 被设计为围绕 Thread 和 Handler 的辅助类,并不构成通用线程框架。AsyncTasks 最好用于短时间的操作(最多几秒钟)。如果您需要保持线程长时间运行,强烈建议您使用 java.util.concurrent 包提供的各种 API,例如Executor、ThreadPoolExecutor 和 FutureTask。
异步任务由在后台线程上运行的计算定义,其结果在 UI 线程上发布。异步任务由 3 个通用类型定义,称为 Params、Progress 和 Result,以及 4 个步骤,称为 onPreExecute、doInBackground、onProgressUpdate 和 onPostExecute。
有关使用任务和线程的更多信息,请阅读进程和线程开发人员指南。