0

假设我的应用程序中有此代码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();
4

3 回答 3

1

这取决于您发布的代码的哪些部分被考虑。您的代码中涉及 ​​3 个线程。

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

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

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

于 2012-06-23T00:51:40.757 回答
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()); 
于 2012-06-23T15:01:16.277 回答
0

假设我在应用程序的 AlertDialog.Builder(context) 中有此代码

它将始终在 UI 线程上运行

于 2012-06-23T03:10:44.653 回答