我只是发现 背后的事实是什么,而不是在 doInBackground() 中使用 Context 。实际上我们不能直接更新 doInBackground() 内部的 UI,要更新 doInBackground() 内部的 UI,我们必须通过 publishProgress() 方法调用其他线程,该方法负责调用 onProgressUpdate()
所以简而言之,我只是想知道 UI threadAsyncTask 之间的化学 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/

10-10 17:32