android的新手 - 这个背景会被调用多少次

时间:2014-02-11 13:16:57

标签: java android multithreading

我创建了以下后台线程:

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;。这是否意味着有另一种方法来创建新线程?我只知道这种方式。

3 个答案:

答案 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

What is the Android UiThread (UI thread)