2012-06-23 56 views
0

假設我在我的應用程序的AlertDialog.Builder(context)中有此代碼。問題是在哪個Thread它會運行?這個AsyncTask在哪裏運行?

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(); 
+0

問題對我來說並不是很清楚,你究竟在尋找什麼。我認爲它只是在每個內部創建3個線程,最終將執行「長時間運行」。每個線程都將繼續創建新的線程。 – anargund

回答

1

運行既然你問了一個額外的問題,在您的評論對Vipul Shah的回覆,我會在這裏回答它(它需要一個代碼塊)。您的問題是:

您確定嗎? [是否全部在UI線程上運行]我該如何調查這些?

用下面的代碼塊發佈。

注意我注入到代碼中的Log.i調用。運行你的應用程序,並檢查logcat輸出。 「線程名稱」將分別以「Thread1:」,「Thread2:」,「Thread3:」開頭的行列出。無論你在輸出中看到「main」,它都將意味着你的UI線程。在其他情況下,您會看到該線程的名稱,例如「Thread14」用於myPrettyOperation。

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()); 
+0

謝謝,正是我需要的。 –

1

它取決於您發佈的代碼的哪一部分被考慮。您的代碼中涉及3個線程。

顯然,run()的主體將運行在您爲myPrettyOperation創建的線程中。

「myPrettyOperation.start(); return true;」將在系統的線程池爲AsyncTask分配的線程中運行。

代碼的其餘部分將您的應用程序的UI線程(即主線程)上運行。

0

說我有我的 應用在AlertDialog.Builder(上下文)這個代碼

它總是在UI線程

+0

你確定嗎?我怎樣才能更多地進行調查? –