有人问我,AsyncTask
,Thread
,Runnable
这样的话题在应用程序级别上运行,或者是否在活动级别上运行?
所有线程都在后台工作,可能会也可能不会将输出返回到主线程(activity / fragment)。
例如我AsyncTask.execute()
和onPostExecute()
我将返回一些数据。在doInBackground
和onPostExecute
之间,如果I / OS杀死活动而不是onPostExecute
将数据传递给不再可用但在回调方法内部的活动,我首先检查活动是否正在运行,否则执行什么都没有。
这意味着线程在应用程序级别运行我是不是正确?
答案 0 :(得分:0)
线程在应用程序级别运行。
活动只是组织代码的应用程序组件。
当应用程序被终止时,运行所有线程的进程将被终止。
了解更多信息: http://developer.android.com/guide/components/processes-and-threads.html
答案 1 :(得分:0)
首先,我们可以检查这些类的定义。
Runnable是一个接口,定义如下:
package java.lang;
public interface Runnable {
void run();
}
Thread是一个实现Runnable接口的类,定义如下:
package java.lang;
public class Thread implements Runnable {
public Thread() {
throw new RuntimeException("Stub!");
}
}
AsyncTask是一个抽象类,定义如下:
package android.os;
public abstract class AsyncTask<Params, Progress, Result> {
public final AsyncTask<Params, Progress, Result> execute(Params... params) {
throw new RuntimeException("Stub!");
}
}
正如你所说,一个Activity正在主线程上运行,同时一个Runnable可能会也可能不会在同一个线程上运行,因为它只是一个接口,只是一段代码。
AsyncTask不在主线程上运行,它在非UI线程上运行,因此当活动在主线程上运行时,它可以执行一些并行作业。
应用程序生命周期控制下的所有对象(Activity,AsyncTask,Thread)。
答案 2 :(得分:0)
AsyncTask,Thread,Runnable等线程在应用程序级别运行还是在活动级别运行?
它们在Application level
上运行,因为Activity may be destroyed
而AsyncTask或Thread正在从Web
下载文件。
在执行此类operation
时还有一件事情是使用getApplicationContext()
,否则会导致内存泄漏。