2011-10-22 37 views
1

我用的AsyncTask改變TextView中的文字是這樣的工作的AsyncTask不能在線程的Android

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    textView = (TextView) findViewById(R.id.txt); 
    Button button = (Button)this.findViewById(R.id.button); 
    button.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      new LongOperation().execute(new String[]{"Hello"}); 
     } 
     }); 
    } 

但問題時,我叫它在我的線程中,程序被迫關閉

this.closeButton.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Thread t= new Thread(){    
      @Override 
      public void run(){          
       try{ 
        //Do something 
        //Then call AsyncTask 
       new LongOperation().execute(new String[]{"Hello"}); 

       }catch(Exception e){} 
     } 
     };  
     t.start(); 
     } 
     }); 

我在哪裏錯了?我不明白差異如何在線程中調用AsyncTask。

+1

我很好奇你爲什麼需要在另一個線程中調用AsyncTask作爲自己AsyncTask已經是一個單獨的線程。看來這個註釋//做一些你在另一個線程中的東西可能是LongOperation的doInBackground的一部分。你可能有一個有效的用例,但我很少看到這樣使用線程內的線程,比如你正在做什麼。 – momo

回答

8

我建議您參考AsyncTask documentationProcesses and Threads以更好地瞭解它是如何工作的。實質上,您應該在主線程上創建​​子類。

當您撥打AsyncTask.execute()時,您提供的AsyncTask.onPreExecute在主線程中被調用,因此您可以進行UI設置。

Next AsyncTask.doInBackground方法被調用,並在其自己的線程中運行。

最後,當AsyncTask.doInBackground方法完成時,在主線程上調用AsyncTask.onPostExecute,並且可以執行任何UI清理。

如果您需要從AsyncTask.doInBackground方法中更新UI,請致電AsyncTask.publishProgress,它將在主線程中調用onProgressUpdate

+0

謝謝,我已閱讀文檔和示例。我知道它是如何工作的。我發現這個規則:任務實例必須在UI線程上創建。但我想在我自己的線程中調用它。我怎樣才能做到這一點? – R4j

+1

異步任務本身是一個therad,所以ü不需要把螺紋 – Richa

+0

您可以使用runOnUiThread() – Sripathi

2

當您從UI線程調用它時,關聯的Context正在運行Activity。當你從普通線程調用它時,沒有與該線程關聯的有效ContextAsyncTask在自己的線程中執行,您不應該創建自己的線程。如果這是實際的代碼,那麼你錯過了AsyncTask的點。搜索如何使用它的教程。

+0

謝謝,我已閱讀文檔和一些教程,我知道如何使用它。但問題是,我**必須**使用線程和做一些事情。之後,UI應該更新。但是我找不到嘗試的方法。 – R4j

+0

如果你必須在主UI線程之外創建一個線程,那麼AsyncTask是一個錯誤的方法。您仍然可以創建普通線程,並使用[Runnable](http://developer.android.com/reference/java/lang/Runnable.html)和[Handler](http://developer.android)在它們之間進行調用。 com/reference/android/os/Handler.html) –

+0

非常感謝。我使用處理程序,它爲我工作,哈哈 – R4j

1

添加到其他人所說的內容:我認爲即使您從不同於UI的線程啓動AsyncTask,也可以使用AsyncTask啓動另一個線程中的任務。

但是在這種情況下,您將只能間接修改UI的唯一方式,例如:將當前Activity的處理程序以某種方式傳遞給此AsyncTask實例並向其發送消息(處理消息得到處理在UI線程上)。或者使用活動捕獲並相應更新用戶界面的廣播意圖等。儘管如此,這些解決方案似乎是過分的。