我创建了以下后台线程:
public class loadSomeStuff extends AsyncTask <String, Integer, String>
{
@Override
protected String doInBackground(String... params) {
Intent i = new Intent("com.example.nadir_services.himan.class"); startActivity(i);
return null;
}
}
我还创建了一个按钮,我在其中调用此线程:
new loadSomeStuff().execute("");
所以,我的问题是,每次按下此按钮,它会创建一个新线程吗?如果是这样,为什么那么糟糕?我的意思是,会发生什么?
还有一个问题,我注意到这被称为&#34;后台线程&#34;。这是否意味着有另一种方法来创建新线程?我只知道这种方式。
答案 0 :(得分:5)
不,AsyncTask
由4个线程的ThreadPool构成,默认情况下系统会选择其中一个线程来运行。
一般情况下,如果你想避免内存问题,你应该从onClick初始化AsyncTask并从那里执行它,而不是每次都像这样创建一个新的:
private loadingTask = new LoadSomeStuff();
@Override
public void onClick(View v) {
loadingTask.execute("");
}
编辑,以供将来参考,请查看source code for AsyncTask
答案 1 :(得分:1)
会创建一个新线程吗?
不,AsyncTask被添加到线程池(最初为4,最多为(CPU * 2的数量)+ 1),用于运行后台任务。
为什么那么糟糕?
每次单击按钮时都不应创建AsyncTask的新实例。您应该在onClick之外声明AsyncTask的实例,并且只在该方法中启动它。
这是否意味着还有另一种创建新线程的方法?
是。 AsyncTask为您提供实用的回调方法,以了解任务何时完成(onPostExecute),在任务运行之前执行代码(onPreExecute),发布进度......另一种方法是创建Worker Thread。
答案 2 :(得分:0)
它被称为“后台线程”,因为有一个“主”线程,它是Android的UI线程。这基本上控制/操作用户面前发生的事情。
当您调用异步任务 - 后台线程 - 意味着与您的任务相关联的操作被分解为操作中发生的事情,同时分析用户在前台发生的事情。
要准确理解差异,请查看:
http://developer.android.com/guide/components/processes-and-threads.html
http://developer.android.com/training/multiple-threads/communicate-ui.html
http://developer.android.com/reference/android/os/AsyncTask.html