这个AsyncTask会在哪里运行?

时间:2012-06-23 00:40:36

标签: android

假设我在我的应用程序的AlertDialog.Builder(context)中有此代码。问题是它会运行Thread吗?

final Thread myPrettyOperation = new Thread() {
    @Override
    public void run() {
        //Do some really long operation.
    }
};
class MyPrettyTask extends
        AsyncTask<Void, Integer, Boolean> {
    protected Boolean doInBackground(
            Void... voids) {
        myPrettyOperation.start();
        return true;
    }
    protected void onProgressUpdate(
            Integer... progress) {
    }
    protected void onPostExecute(Boolean result) {
    }
}
new MyPrettyTask().execute();

3 个答案:

答案 0 :(得分:1)

这取决于您发布的代码的哪些部分。您的代码中涉及3个主题。

显然,run()的主体将在你为myPrettyOperation创建的线程中运行。

“myPrettyOperation.start();返回true;”将在系统中为AsyncTask从线程池分配的线程中运行。

其余代码将在UI线程上运行(即在主线程上)应用

答案 1 :(得分:1)

由于您在评论中对Vipul Shah的回复中提出了其他问题,我将在此处回答(需要代码块)。你的问题是:

  

你确定吗? [是否全部在UI线程上运行] 我该如何进行更多调查?

我在下面发布了代码块。

注意我注入代码的Log.i调用。运行您的应用程序,并检查logcat输出。线程名称'将分别列出以“Thread1:”,“Thread2:”,“Thread3:”开头的行。无论你在输出中看到“main”,它都意味着你的UI线程。在其他情况下,您将看到线程的名称,例如你的myPrettyOperation的“Thread14”。

final Thread myPrettyOperation = new Thread() {
    @Override
    public void run() {
        Log.i("YOUR_TAG", "Thread1: "+ Thread.currentThread().getName()); 
        //Do some really long operation.
    }
};
class MyPrettyTask extends
        AsyncTask<Void, Integer, Boolean> {
    protected Boolean doInBackground(
            Void... voids) {
        Log.i("YOUR_TAG", "Thread2: "+ Thread.currentThread().getName()); 
        myPrettyOperation.start();
        return true;
    }
    protected void onProgressUpdate(
            Integer... progress) {
    }
    protected void onPostExecute(Boolean result) {
    }
}
new MyPrettyTask().execute();
Log.i("YOUR_TAG", "Thread3: "+ Thread.currentThread().getName()); 

答案 2 :(得分:0)

  

说我在我的AlertDialog.Builder(context)中有这个代码   应用

它将始终在UI线程上运行