Android: не удается разрешить метод findViewById (int) в AsyncTask

Следуя инструкциям здесь, я создал приложение, которое должно иметь возможность загружать изображение с URL-адреса и помещать его в ImageView. Единственная проблема заключается в том, что он не может найти findViewById, потому что он находится в классе Activity вместо класса AsyncTask. Код здесь:

package com.example.weather2; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.AsyncTask; import android.util.Log; import android.widget.ImageView; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.URL; public class ImageDownloader extends AsyncTask<String, Integer, Bitmap> { protected void onPreExecute(){ //Setup is done here } @Override protected Bitmap doInBackground(String... params) { //TODO Auto-generated method stub try{ URL url = new URL(params[0]); HttpURLConnection httpCon = (HttpURLConnection)url.openConnection(); if(httpCon.getResponseCode() != 200) throw new Exception("Failed to connect"); InputStream is = httpCon.getInputStream(); return BitmapFactory.decodeStream(is); }catch(Exception e){ Log.e("Image", "Failed to load image", e); } return null; } protected void onProgressUpdate(Integer... params){ //Update a progress bar here, or ignore it, I didn't do it } protected void onPostExecute(Bitmap img){ ImageView iv = (ImageView) findViewById(R.id.imageView); //here is where the issue is if(iv!=null && img!=null){ iv.setImageBitmap(img); } } protected void onCancelled(){ } } 

Когда я комментирую строки с проблемой, я не получаю никаких ошибок, что заставляет меня думать, что она работает, но я не могу сказать, потому что нет изображения. Любая помощь для решения этой проблемы была бы очень оценена.

findViewById – это метод класса Activity.

И у вас есть

  public class ImageDownloader extends AsyncTask<String, Integer, Bitmap> // not a activity class 

Если вам нужны данные в действии, вы можете использовать интерфейс как обратный вызов активности.

Я бы обновил ui в самой Деятельности. Посмотрите @ blackbelts ответ

Как вернуть логическое значение из AsyncTask?

Или

Сделайте AsyncTask внутренним классом класса Activity и обновите ui в onPostExecute

Также вы можете найти этот блог от Alex Loockwood интересным

http://www.androiddesignpatterns.com/2013/04/retaining-objects-across-config-changes.html

Вместо вызова findViewById() в AsyncTask передайте ImageView в качестве параметра:

 public class ImageDownloader extends AsyncTask<String, Integer, Bitmap> { final ImageView mImageView; public ImageDownloader(ImageView imageView) { mImageView = imageView; } // ... 

Используйте свою деятельность непосредственно при настройке / получении изображения. Это решит вашу проблему.

 public class ImageDownloader extends AsyncTask<String, Integer, Bitmap> { private Context context; public ImageDownloader(Activity yourActivity) { context = activity; } // ... protected void onPostExecute(Void... params){ ImageView iv = (ImageView) context.findViewById(R.id.imageView); if(iv!=null && img!=null){ iv.setImageBitmap(img); } } } 

Используйте команду cast в AppCompatActivity, например:

 public class ImageDownloader extends AsyncTask<String, Integer, Bitmap> { private Context context; public ImageDownloader(Activity yourActivity) { context = yourActivity; } // ... protected void onPostExecute(Void... params){ //Here ImageView iv = (ImageView) ((AppCompatActivity) context).findViewById(R.id.imageView); if(iv!=null && img!=null){ iv.setImageBitmap(img); } } 

}

Вы можете реализовать AsyncTask как внутренний класс своей деятельности. И поместите ImageView iv = (ImageView) findViewById(R.id.imageView); В методе onCreate () вашей активности. Это то, что я сделал в своем проекте.

Или вы можете передать активность. Это как параметр для конструктора AsyncTask. И используйте ImageView iv = (ImageView)activity. findViewById(R.id.imageView) ImageView iv = (ImageView)activity. findViewById(R.id.imageView) в методе onPostExecute () AsyncTask.

Intereting Posts
Поиск текущей позиции в андроиде без GPS Размер значка Google Glass Launcher Как масштабировать потоковое растровое изображение на месте, не читая сначала все изображение? Получить Bitmap из ImageView в Android L Android-эмулятор «Launcher» не отвечает, хотите ли вы его закрыть? Как рисовать анимированный вид в Android? Активная ссылка url на Android в TextView Должен передавать разрешенные пиксельные измерения вместо идентификатора ресурса здесь: getResource (). GetDimession * (ViewGroup.LayoutParams.WRAP_CONTENT) Не можете увидеть Wi-Fi-трафик со своего мобильного телефона в Wireshark? Попытка прикрепить файл с SD-карты к электронной почте Как сделать анимацию справа налево в макете Создание кнопок автоматически перемещается по экрану Самый быстрый способ протестировать модифицированный исходный код Android? Как сделать приложения для iOS / Android совместимыми с разделом 508 Закона США о реабилитации? Поделитесь потоковым видеороликом в андроиде через ACTION_SEND