2013-06-20 52 views
1

我使用下面的代碼:的AsyncTask get()方法不能正常工作

//(...) 
translationTextView.setText("Searching for translation..."); 
translationTextView.setVisibility(View.VISIBLE); 

myAsyncTask = (MyAsyncTask) new MyAsyncTask().execute(someString); 

try { 
    //As I understand it should wait here until AsyncTask is completed. But why for the time of execution translateTextView value is ""? 
    translationTextView.setText(translateTask.get() + "<BR>"); 
} catch (InterruptedException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} catch (ExecutionException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

的問題是,translationTextView值是「」,直到myAsyncTask完成。所以它看起來像

translationTextView.setText("Searching for translation..."); 

不被調用。我做錯了什麼?

+0

我認爲這只是你的問題中的一個錯字,但你正在初始化「myAsyncTask」,但是調用get「translateTask」。無論哪種方式,你不應該調用主UI線程。 –

回答

2

這就是所謂的,但然後調用

translationTextView.setText(translateTask.get() + "<BR>"); 

get()是一個阻塞調用

嘗試,而不是設置文本在onPostExecute()。如果我理解正確,那麼這樣的事情應該給你想要的

//(...) 
     translationTextView.setText("Searching for translation..."); 
     translationTextView.setVisibility(View.VISIBLE); 

     myAsyncTask = (MyAsyncTask) new MyAsyncTask().execute(someString); 

什麼然後,假設MyAsyncTask是一個內部類的Activity通話translationTextView.setText()插入無論你正試圖從doInBackground()

+0

但是爲什麼在調用get()方法之前代碼沒有執行?我怎樣才能使它工作? – Marek

+0

試試我的更新回答。另外,你可以在那裏放置一個斷點來看看究竟執行了什麼。一個進度對話框可能會更好,所以用戶看到一些正在移動的東西,並不認爲你的應用程序被凍結了......它對用戶而言是一種心理上的東西 – codeMagic

+0

這正是我之前做的。我的任務是在線翻譯文本。但在此之後,我還會離線翻譯它。在致電離線翻譯之前,我想等待在線翻譯完成。直到現在,我在onPostExecute方法中調用離線翻譯,但我認爲這不是一個好方法,考慮到我的任務名稱是onlineTranslation ...我希望那個任務只做在線翻譯,並且在完成之後從main調用離線翻譯線程... – Marek

1

回報codeMagic的指出,如果您還沒有覆蓋AsyncTask子類的方法。它在主線程上執行,你應該在那裏更新你的UI。