2013-08-27 4 views
-2

Я хочу загрузить данные из Интернета и обновить пользовательский интерфейс в пределах doInBackground(), Для этого я думаю, что мне нужно получить ссылку на активность внутри этого метода. Как я могу это сделать или есть другой способ сделать это ? Какой должен быть параметр? Или не удается обновить пользовательский интерфейс в реальном времени?Как обновить интерфейс в AsyncTask

public class DownloadActivity extends ListActivity { 

public class DownloadItems extends AsyncTask<Something,Integer,Long> { 

    @Override 
    protected Long doInBackground(DownloadActivity... params) { 

     Toast.makeText(params[0], getIntent().getExtras().get("location").toString(), Toast.LENGTH_SHORT).show(); 
     return null; 
    } 

} 

public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    new DownloadItems().execute(Something); 
} 

} 
+1

Plz ссылается на этот http://stackoverflow.com/questions/9671546/asynctask-android-example –

ответ

0

Лучший способ - просто перемещать все, что влияет на интерфейс пользователя, на onPostExecute(), потому что он позволяет вам обновлять пользовательский интерфейс, это его точка.

Есть и другие способы, но при использовании AsyncTask нет причин не использовать это.

public class DownloadActivity extends ListActivity { 

    public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     new DownloadItems(this).execute(); 
    } 

    public class DownloadItems extends AsyncTask<Something,Integer,Long> { 

     private Context context; 

     public DownloadItems(Context c){ 
      context = c; 
     } 

     @Override 
     protected Long doInBackground(DownloadActivity... params) { 
      // Do something 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void result) { 
      super.onPostExecute(result); 
      Toast.makeText(context, context.getIntent().getExtras().get("location").toString(), Toast.LENGTH_SHORT).show(); 
     } 
    } 
} 
+0

Его работа прекрасна, но cann't добавить вид деятельности. this.addContentView (view, params) работает внутри onCreate, но не с Context ctx внутри onPostExecute(), почему это и как я могу это решить? ----> пожалуйста, помогите мне <----- – user2722364

+0

Спасибо за то, что вы указали использование конструктора в этой проблеме, мне удалось добавить представление с помощью простого изменения. Контекст к типу DownloadActivity – user2722364

+0

@ user2722364 Итак, мой ответ решил проблему? :) – whitfin

0

Вы можете создать конструктор для передачи или добавления Контекста в качестве параметра.

public class DownloadItems extends AsyncTask<Something,Integer,Long> { 

    Context context; 

    public DownloadItems(Context cntx){ 
     context = cntx; 
    } 
    @Override 
    protected Long doInBackground(DownloadActivity... params) { 

     //Toast.makeText(params[0], getIntent().getExtras().get("location").toString(), Toast.LENGTH_SHORT).show(); 
     Toast.makeText(context, "String test", Toast.LENGTH_SHORT).show(); 
     return null; 
    } 

} 

public void onCreate(Bundle savedInstanceState){ 
    super.onCreate(savedInstanceState); 
    new DownloadItems(this).execute(Something); 
} 

Передавая контекст своей деятельности, вы можете выполнить любую операцию, связанную с контекстом.

+0

Не будет ли это исключение? –

+0

где? Я пробовал этот подход. –

+0

Его работа прекрасна, но cann't добавить вид деятельности. this.addContentView (view, params) работает внутри onCreate, но не с Context ctx внутри onPostExecute(), почему это и как я могу это решить? ----> пожалуйста, помогите мне <----- – user2722364

2

Вы можете использовать Handler или обновить свой интерфейс в onPostExecute(), который я рекомендую. Пусть ваша Async позаботится о своей фоновой логике и обновит интерфейс, когда эта работа будет завершена.

+1

onPostExecute вызывается после завершения doInBackground, для нескольких элементов и обратной связи на каждом из них переопределяет onProgressUpdate к обратной связи по каждому пункту, как это происходит. –

+0

Просьба, можете ли вы разместить код примера?Это похоже на то, что я ищу ----> – user2722364

0

Вы не можете выполнять операции пользовательского интерфейса в doInBackground(), вы должны сделать их в onPostExecute(). В DownloadActivity, вы создаете экземпляр DownloadItems, и передать его URL-адрес, где вы хотите, чтобы загрузить материал: Например:

public class DownloadActivity extends ListActivity { 

    private void someMethod() { 
     DownloadItems yourTask = new DownloadItems(getApplicationContext()); 
     yourTask.execute(yourUrl); 
    } 

В AsyncTask, вы будете делать скачиваемые операции в doInBackground() и вернуть результат, поэтому он может быть обработан onPostExecute():

public class DownloadItems extends AsyncTask<Something,Integer,Long> { 

    Context mContext; 

    public DownloadItems(Context context){ 
     mContext = context; 
    } 

    @Override 
    protected String doInBackground(String... params) { 

     String theResult; 
     // download operations using url stored in params[0], and where you set theResult variable (for example...) 
     return theResult; 
    } 

в onPostExecute(), вы имеете дело с результатом, например, в коде выше, вы можете позвонить Тост:

 @Override 
     protected void onPostExecute(String result) { 
      Toast.makeText("YOUR TAG", result, Toast.LENGTH_SHORT).show(); 
     } 
+0

Его работа прекрасна, но cann't add View для деятельности. this.addContentView (view, params) работает внутри onCreate, но не с Context ctx внутри onPostExecute(), почему это и как я могу это решить? ----> пожалуйста, помогите мне <----- – user2722364

+0

Спасибо за показ использования конструктора в этой проблеме, я смог добавить представление простым изменением Контекст к типу DownloadActivity – user2722364

+0

Вы можете передать свой контекст в действие: ' private Activity = (Activity) mContext', то вы можете вызывать 'addView()' on mActivity. Тогда вы можете принять мой ответ :) – jbihan

0

Вы можете назвать это в doInBackground:

runOnUiThread(new Runnable() { 
    public void run() { 
     //Your code 
    } 
}); 

Но это не так ... Пожалуйста, прочитайте AsyncTask для получения более подробной информации, или использовать onPostExecute для обновления пользовательского интерфейса ...

+0

Почему негативы? Это не правильно? Это работа, и я даю верный ответ и показываю документы для правильного подхода .... –