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.
- Cómo corregir este error "Límite de sobrecarga de GC excedido en Eclipse"
- Con el estudio de Android no se encontró jvm, JAVA_HOME se ha configurado
- Lectura de Android desde un flujo de entrada eficientemente
- ¿Cómo llamar a un servicio web RESTful de Android?
- Extraño resultado de análisis de fecha y hora con SimpleDateFormat
- Android / Java Regex para eliminar ceros adicionales de sub-cadenas
- Java.lang.IllegalStateException: ScrollView puede alojar sólo un hijo directo
- ¿Cómo agregar una foto de contacto a ImageView?
- ¿Cómo utilizar LibSVM en Java?
- Sonido que no juega en android> sándwich de helado
- Hacer una aplicación de Android que no se puede desinstalar / eliminar
- AES Encryption Android <-> iOS resultados diferentes en la longitud del mensaje> 15 byte
- AlarmManager efecto en la batería de una aplicación de reloj despertador
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.