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