为什么不能在AsyncTask的doInBackground()中使用上下文

Dwi*_* Ji 4 multithreading android android-context android-asynctask

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

Met*_*247 5

问:为什么不能在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的上下文。