Android: no se puede resolver el método 'findViewById (int)' en AsyncTask

Después del tutorial aquí he configurado una aplicación que debería ser capaz de descargar una imagen de una URL y colocarla en un ImageView. El único problema es que no puede encontrar findViewById porque está en la clase Activity en lugar de la clase AsyncTask. Código está aquí:

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(){ } } 

Cuando comento las líneas con el problema, no tengo ningún error, lo que me hace pensar que está funcionando, pero no puedo decirlo porque no hay imagen que se publique. Cualquier ayuda para resolver este problema sería muy apreciada.

findViewById es un método de clase de actividad.

Y tu tienes

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

Si necesita los datos de vuelta en la actividad que podría utilizar la interfaz como una devolución de llamada a la actividad.

Actualizaría ui en la actividad misma. Mira las correas negras responden

¿Cómo devuelvo un booleano de AsyncTask?

O

Hacer AsyncTask una clase interna de la clase Activity y actualizar ui en onPostExecute

También puede encontrar este blog de Alex Loockwood interesante

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

En lugar de llamar a findViewById() en AsyncTask , pase el ImageView como un parámetro:

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

Utilice su actividad directamente al configurar / obtener la imagen. Esto resolverá su problema.

 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); } } } 

Utilice el molde para AppCompatActivity, como:

 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); } } 

}

Puede implementar AsyncTask como una clase interna de su actividad. Y poner ImageView iv = (ImageView) findViewById(R.id.imageView); En el método onCreate () de su actividad. Eso es lo que hice en mi proyecto.

O puede pasar la activity.this como un parámetro al constructor de AsyncTask. Y utilice ImageView iv = (ImageView)activity. findViewById(R.id.imageView) ImageView iv = (ImageView)activity. findViewById(R.id.imageView) en el método onPostExecute () de AsyncTask.

  • libGDX + com.google.android.gms: play-services: 7.0.0: android: dexDebug
  • No recibe datos de ubicación del hilo
  • Android / SQLite / Múltiples tablas
  • Recursos $ NotFoundException al llamar a Robolectric.buildActivity ()
  • OSMdroid no pudo encontrar la clase GeoPoint
  • Roto, gota, sombra, flotante, acción, botón, pre, lollipop
  • No se puede encontrar la clase de símbolo "Generated" para Dagger 2
  • Cómo saber si este hilo es un hilo de interfaz de usuario
  • Android Push Notificación del dispositivo a otros dispositivos
  • ¿Cómo puede hacer que el reconocimiento de voz del soporte para el emulador android
  • ¿Cómo lanzar draw9patch y es absolutamente necesario reescalar imágenes?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.