Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Java.lang.NullPointerException: Intenta invocar el método virtual 'android.view.View .MainActivity.findViewById (int)' en una referencia de objeto nulo

Tengo una clase llamada MainActivity.java que llama a una clase AsyncTask . La última clase tiene un findViewById() que en ejecución devuelve este error:

 java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View <mypackage>.MainActivity.findViewById(int)' on a null object reference 

No entiendo cómo puedo editar un ImageView colocado en R.layout.activity_main después de que un AsyncTask termine de funcionar.

MainActivity.java

 public class MainActivity extends Activity { public MainActivity() {} @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); new Connection().execute(); } } 

Connection.java

 public class Connection extends AsyncTask<String, Void, String> { public String result; //I know, this isn't correct, how can i do? public MainActivity MainActivity; @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub //... return "a string"; } protected void onPostExecute(String result) { super.onPostExecute(result); //... // Where the error is generated ImageView image = (ImageView) MainActivity.findViewById(R.id.image); //... } } 

  • ¿Qué son WindowInsets?
  • Cómo hacer http obtener solicitud en Android
  • ¿Cómo olvidar una red inalámbrica en android mediante programación?
  • Android rxJava Manejo de errores con retroadaptación
  • Definir un mapa como constante en java
  • ¿Es esta una buena técnica (Uso de titular de datos) para eliminar la clase anónima, para reducir el riesgo de pérdida de memoria
  • ¿Cómo puedo configurar la imagen de fondo con picasso en el código
  • 'Código fuente no coincide con el bytecode' al depurar en un dispositivo
  • 4 Solutions collect form web for “Java.lang.NullPointerException: Intenta invocar el método virtual 'android.view.View .MainActivity.findViewById (int)' en una referencia de objeto nulo”

    El error es que

     public MainActivity MainActivity; 

    Nunca se inicializa, señalando así a null. Para que su código funcione, el paso mínimo está en MainActivity

     new Connection(this).execute(); 

    En conexión

     public class Connection extends AsyncTask<String, Void, String> { public MainActivity MainActivity; public Connection(MainActivity activity) { MainActivity = activity; } 

    Pero crear una tarea en onCreate y pasar una Actividad no es la mejor idea de todos modos. Además, los nombres de campo siempre deben comenzar con una letra minúscula.

    La mejor manera es pasar un ImageView al AsyncTask. No inicie una tarea hasta que se inicie la actividad y también, no olvide cancelar la tarea cuando se detiene la actividad.

     public final class MainActivity extends Activity { public MainActivity() {} private Connection connection; private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); imageView = (ImageView) findViewById(R.id.image); } @Override protected void onStart() { super.onStart(); if (connection == null || connection.getStatus() != AsyncTask.Status.RUNNING) { connection = new Connection(imageView); connection.execute(); } } @Override protected void onStop() { super.onStop(); if (connection != null && connection.getStatus() == AsyncTask.Status.RUNNING) { connection.cancel(true); } } } 

    En Connection.java, almacene ImageView como una WeakReference para evitar fugas.

     public final class Connection extends AsyncTask<String, Void, String> { private final WeakReference<ImageView> imageViewRef; public Connection(ImageView view) { imageViewRef = new WeakReference<ImageView>(view); } @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub //... return "a string"; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); //... final ImageView imageView = imageViewRef.get(); // if the Activity is still alive, the ImageView will not be null if (imageView != null) { // set an image or whatever you need image.setImageResource(666); } } 

    Poner imageview como una variable de su clase

     private ImageView image; 

    En su onCreate inicializar

     image = (ImageView) findViewById(R.id.image); public class Connection extends AsyncTask<String, Void, String> { public String result; //I know, this isn't correct, how can i do? public MainActivity MainActivity; @Override protected String doInBackground(String... arg0) { // TODO Auto-generated method stub //... return "a string"; } protected void onPostExecute(String result) { super.onPostExecute(result); //... // Where the error is generated //do other stuff with your imageview //... } } 

    No especificó qué parámetro pasó a Connection.java AsyncTask .

    Uno de mis estudiantes también tiene el mismo problema. A pesar de que está utilizando Volley Library para HttpConnection (publicación de datos) y el principal problema fue: está escribiendo la URL directamente sin el prefijo de protocolo http es decir

    String post_url ="api/do_post";

    Simplemente agregue http/https al frente de su url de correo:

    String post_url ="http://api/do_post";

    En realidad estaba trabajando una actividad y aplicación de servicio. Mismo problema que también tengo, en que en bindservice he utilizado el BIND_IMPORTANT bandera en lugar de utilizar BIND_AUTO_CREATE.

    Una vez que cambié la bandera fue trabajado con éxito para mí.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.