2013-06-20 7 views
1

Я использую следующий код:AsyncTask получить() метод не работает должным образом

//(...) 
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», но назовите «translateTask». В любом случае вы не должны называть основной поток пользовательского интерфейса. –

ответ

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 ... Я бы хотел, чтобы эта задача выполняла только онлайн-перевод и после того, как она была завершена. Thread ... – Marek

1

Как codeMagic указывает, переопределите метод onPostExecute() вашего подкласса AsyncTask, если вы еще этого не сделали. Он выполняется в основном потоке, вы должны обновить свой интерфейс.

Смежные вопросы