java.lang.NullPointerException : Tentativa de chamar o método virtual ' android.view.View .MainActivity.findViewById (int) ' em uma referência de objeto nulo

? Kaos @ | Original: StackOverFlow
---

Eu tenho uma classe chamada MainActivity.java que chamam de AsyncTask class . A última classe tem uma findViewById() que, em execução retornar esse erro:

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

Eu não entendo como posso editar um ImageView posicionado em R.layout.activity_main depois que um AsyncTask finish para trabalhar .

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

            //...

    }
}
---

Top 5 Responder

1Lucian Novac @

colocar ImageView como uma variável de sua classe

imagem ImageView privado;

em seu initialize onCreate

image = (ImageView) findViewById(R.id.image);

Connection classe pública estende AsyncTask {     String resultado pública;

//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

        //...

}

}

2Devill @

Move this line

ImageView image = (ImageView) MainActivity.findViewById(R.id.image);

para onCreate () com

 ImageView image = (ImageView)findViewById(R.id.image);
3Doctoror Drive @

O erro é que

public MainActivity MainActivity;

nunca é inicializado, apontando assim para null. Para fazer o seu trabalho de código o passo mínimo é em MainActivity

new Connection(this).execute();

In Connection

public class Connection extends AsyncTask<String, Void, String> {

    public MainActivity MainActivity;

    public Connection(MainActivity activity) {
        MainActivity = activity;
    }

Mas a criação de uma tarefa no onCreate e passando uma atividade não é a melhor ideia de qualquer maneira. Além disso, nomes de campo deve sempre começar com uma letra minúscula .

A melhor maneira é passar um ImageView ao AsyncTask . Não inicie uma tarefa até que a atividade é iniciado e também, não se esqueça de cancelar a tarefa quando a atividade é interrompida .

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

}

Em Connection.java, armazenar um ImageView como WeakReference para evitar vazamentos.

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

    }