为什么Context不能在AsyncTask的doInBackground()中使用

时间:2013-09-19 09:26:30

标签: android multithreading android-asynctask android-context

我只是找到doInBackground() 中不使用Context背后的事实。事实上,我们无法直接更新doInBackground()内部的UI,更新doInBackground()内部的UI,我们必须通过负责调用publishProgress()的{​​{1}}方法调用其他线程。 /> 所以简而言之,我只是想知道onProgressUpdate()UI thread之间的化学反应,以及为什么AsyncTask在UI线程中执行。

3 个答案:

答案 0 :(得分:4)

Q 为什么不能在AsyncTask的doInBackground()中使用Context?

上下文顾名思义,它是应用程序/对象当前状态的上下文。它允许新创建的对象了解正在发生的事情。通常,您可以调用它来获取有关程序其他部分(活动,包/应用程序)的信息

doInBackground()与doInBackground()中的当前活动无关或/(上下文)或与当前活动无关。您无权访问主线程。它完全是一个新的活动,即使你的主线程/活动已经停止工作也会执行它的任务。

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()创建新线程之前/之前(可以对主线程进行更改)

onPreExecute()具有主线程的上下文/ AsycTask仍在主线程中

2. doInBackground()创建了自己的新线程来执行给定的任务。一旦进入这个状态/线程,在完成之前你不能做任何事情。

doInBackground()无上下文。新线程是自己创建的。一旦创建新线程,它将完成其给定的任务,而不管主线程是否被杀死/停止。/ AsycTask在新线程中。

3. onPostExecute() - 在doInBackground()完成其任务后,调用onPostExecute(),以便主线程可以使用计算结果

onPostExecute()在主线程中有主线程/ AsycTask的上下文。

答案 1 :(得分:1)

我们可以在doinbackground方法中使用上下文,但只能从ui组件中获取值。我们不能使用contexr在ui组件中设置值

答案 2 :(得分:0)

AsyncTask可以正确,轻松地使用UI线程。该类允许执行后台操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。

AsyncTask旨在成为Thread和Handler的辅助类,并不构成通用的线程框架。理想情况下,AsyncTasks应该用于短操作(最多几秒钟。)如果需要保持线程长时间运行,强烈建议您使用java.util.concurrent pacakge提供的各种API,例如Executor,ThreadPoolExecutor和FutureTask。

异步任务由在后台线程上运行的计算定义,其结果在UI线程上发布。异步任务由3种泛型类型定义,称为Params,Progress和Result,以及4个步骤,称为onPreExecute,doInBackground,onProgressUpdate和onPostExecute。

有关使用任务和线程的详细信息,请阅读 Processes and Threads 开发人员指南。