我只是发现 背后的事实是什么,而不是在 doInBackground()
中使用 Context 。实际上我们不能直接更新 doInBackground() 内部的 UI,要更新 doInBackground() 内部的 UI,我们必须通过 publishProgress()
方法调用其他线程,该方法负责调用 onProgressUpdate()
。
所以简而言之,我只是想知道 UI thread
和 AsyncTask
之间的化学 react 是什么,以及为什么 AsyncTask 在 UI 线程中执行。
最佳答案
Q 为什么在 AsyncTask 的 doInBackground() 中不能使用 Context?
上下文顾名思义,它是应用程序/对象当前状态的上下文。它让新创建的对象了解发生了什么。通常,您调用它来获取有关程序另一部分( Activity 、包/应用程序)的信息
当 doInBackground() 在 doInBackground()
中时没有关系/(上下文)或与当前 Activity 无关。您无权访问主线程。它是一个全新的 Activity ,即使您的主线程/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()
中使用上下文的问题问 为什么我们可以在 onPreExecute() 和 onPostExecute() 中使用上下文?
AsycTask 有
1.
onPreExecute()
Pre/Before 创建新线程(可以更改主线程)onPreExecute() 具有主线程的上下文/AsycTask 仍在主线程中
2.
doInBackground()
已经创建了一个自己的新线程来执行给定的任务。一旦进入这个状态/线程,在它完成之前你不能做任何事情。doInBackground() 无上下文。新线程是自己创建的。一旦新线程被创建,它将完成其给定的任务,而不管主线程在新线程中被杀死/停止。/AsycTask。
3.
onPostExecute()
- doInBackground() 完成其任务后调用 onPostExecute() 使计算结果可以被主线程使用onPostExecute() 在主线程中具有主线程/AsycTask 的上下文。
关于android - 为什么AsyncTask的doInBackground()中不能使用Context,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18890953/