AsyncTask – после выполнения, как обновить представление?

В событии onCreate () для Activity я запустил AsyncTask для извлечения данных из базы данных. После того, как это было успешно завершено, как я могу обновить дисплей?

Metacode:

public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.venueviewbasic); (..) new GetProductDetails().execute(); class GetProductDetails extends AsyncTask<String, String, String> { protected String doInBackground(String... params) { // updating UI from Background Thread runOnUiThread(new Runnable() { public void run() { // Check for success tag int success; try { // Building Parameters List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(new BasicNameValuePair("id", vid)); (.. retrieve and parse data and set new textview contents ..) 

Однако текстовые сообщения и т. Д. Не обновляются.

Solutions Collecting From Web of "AsyncTask – после выполнения, как обновить представление?"

Если вы хотите обновить представление из async после завершения процесса, вы можете использовать

 protected void onPostExecute(String result) { textView.setText(result); } 

Но если вы хотите обновлять данные во время выполнения фонового процесса, то используйте. Для …

 protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100));<------ } return totalSize; } protected void onProgressUpdate(Integer... progress) { <------- setProgressPercent(progress[0]); } 

Подробнее см. Эту ссылку Надеюсь, это поможет вам …!

Я предполагаю, что вопрос заключается в том, как получить представление UI View, если asyncTask находится в отдельном файле.

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

 class MyAsyncTask extends AsyncTask<URL, Integer, Long> { Activity mActivity; public MyAsyncTask(Activity activity) { mActivity = ativity; } 

И затем в вашем использовании onPostExecute

 int id = mActivity.findViewById(...); 

Помните, что вы не можете обновлять представление из «doInBackground», поскольку это не поток пользовательского интерфейса.

В вашем классе AsyncTask добавьте метод onPostExecute . Этот метод выполняется в потоке пользовательского интерфейса и может обновлять любой компонент пользовательского интерфейса.

 Класс GetProductDetails расширяет AsyncTask <...> 
 {
     ...
     Частный текстовый TextView;
     ...
     Protected void onPostExecute (результат строки)
     {
         textView.setText (результат);
     }
 }

(Параметр result – это значение, возвращаемое методом doInBackground вашего класса.)