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