java.lang.NullPointerException : Der Versuch, virtuelle Methode aufrufen ' android.view.View .MainActivity.findViewById (int) " auf ein Null-Objekt Referenz-

? Kaos @ | Original: StackOverFlow
---

Ich habe eine Klasse namens MainActivity.java, die eine AsyncTask Klasse aufrufen . Die letzte Klasse eine findViewById(), dass bei der Ausführung zurück diese Fehlermeldung:

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

Ich verstehe nicht, wie kann ich bearbeiten ein ImageView in R.layout.activity_main nach, dass eine AsyncTask Finish zu arbeiten positioniert .

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 Antwort

1Lucian Novac @

setzen imageview als Variable der Klasse

Bildprivatimageview;

auf Ihrem onCreate initialize

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

public class Anschluss erstreckt AsyncTask {     public String Ergebnis ;

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

um onCreate () -Methode mit

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

Der Fehler ist, dass

public MainActivity MainActivity;

wird nie initialisiert, so zeigte auf null gesetzt. Um Ihren Code funktioniert die Mindeststufe in MainActivity

new Connection(this).execute();

In Connection

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

    public MainActivity MainActivity;

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

Aber die Schaffung einer Task in onCreate und Bestehen einer Aktivität ist nicht die beste Idee ist . Außerdem sollten Feldnamen immer mit einem Kleinbuchstaben beginnen .

Der beste Weg ist, indem ein Imageview mit dem AsyncTask . Haben Sie eine Aufgabe erst starten, wenn die Aktivität gestartet wird, und auch, vergessen Sie nicht, um die Aufgabe zu stornieren, wenn die Aktivität gestoppt wird.

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

}

In Connection.java, speichern eine Imageview als WeakReference, um Lecks zu vermeiden.

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

    }