Dwi*_* Ji 4 multithreading android android-context android-asynctask
我只是在不使用Context内部doInBackground()发现背后的事实是什么。实际上,我们不能直接更新doInBackground()内部的UI,要更新doInBackground()内部的UI,我们必须通过publishProgress()负责调用的方法来调用其他线程onProgressUpdate()。
简而言之,我只想知道UI thread和之间的化学反应AsyncTask,以及为什么AsyncTask在UI Thread中执行。
问:为什么不能在AsyncTask的doInBackground()中使用上下文?
顾名思义,上下文是应用程序/对象当前状态的上下文。它使新创建的对象了解正在发生的事情。通常,您调用它来获取有关程序另一部分(活动,程序包/应用程序)的信息
其中,当doInBackground()与in无关时,它与当前Activity没有关系/(上下文)doInBackground()。您无权访问主线程。它是一个全新的活动,即使您的主线程/活动已停止工作,它也将执行其任务。
AsyncTask不在您用来调用它的主线程或主UI线程上运行,而是在单独的线程上运行以执行赋予它的任务
为了能够在AsycTask完成后对UI进行更改,您必须调用
protected void onPostExecute(String string)
{
Toast c=Toast.makeText(getApplicationContext(), string, Toast.LENGTH_LONG);
c.show();
}
Run Code Online (Sandbox Code Playgroud)
所有的UI更改都可以在受保护的void onPostExecute()中完成
简而言之 doInBackground(),您无法对主线程进行任何更改,并且不依赖于主UI /线程,因此在上下文中使用上下文毫无疑问 doInBackground()
问:为什么我们可以在onPreExecute()和onPostExecute()中使用上下文?
一个AsycTask有
1. onPreExecute()在创建新线程之前/之前(可以对主线程进行更改)
onPreExecute() 对主线程有上下文/ AsycTask仍在主线程中
2. doInBackground() 创建了自己的新线程来执行给定的任务。一旦进入此状态/线程,您将无法完成任何操作。
doInBackground()没有上下文。新线程是自己创建的,一旦创建新线程,无论主线程在新线程中被杀死/停止/ AsycTask,它都会完成其给定的任务。
3 onPostExecute()-doInBackground()完成其任务后,将调用onPostExecute(),以便主线程可以使用计算结果
onPostExecute() 在主线程中具有与主线程/ AsycTask的上下文。