2016-08-04 11 views
0

Ich habe Aufgabe durch Schnittstelle und Callback-Funktion zu implementieren. Wenn der Benutzer ein falsches Konto erhalten hat, wird die Fehlermeldung angezeigt und zu diesem Zeitpunkt sind keine Fehler aufgetreten. Die App stoppt jedoch leider, wenn sich der Benutzer erfolgreich anmeldet.Android - Beenden Sie die aktuelle Aktivität erst nach dem Beenden der asynctask

Java:

public interface AsyncResponse { 
    void processFinish(); 
} 

// start this activity from MainActivity when the button is pressed 
public class login extends AppCompatActivity implements AsyncResponse{ 
    ... 
    BackgroundTask backgroundTask = new BackgroundTask(this); 
    backgroundTask.delegate = this; 
    backgroundTask.execute("login",user_ac_s,user_pw_s); 

    public void processFinish(){ 
     if(!MainActivity.user_ID.equals("0")) 
      finish(); 
    } 
} 

public class BackgroundTask extends AsyncTask<String, Void, String>{ 
    ... 
    public AsyncResponse delegate = null; 
    ... 
    protected void onPostExecute(String result) { 
     super.onPreExecute(); 
     if(task.equals("get_userID")){ 
      MainActivity.user_ID = result; 
      delegate.processFinish(); 
     } 
     if(task.equals("register") || task.equals("login")){ 
      Toast.makeText(context,result,Toast.LENGTH_LONG).show(); 
      if(result.contains("success")){ 
       BackgroundTask get_userID_task = new BackgroundTask(context); 
       get_userID_task.execute("get_userID",user_ac); 
      } 
     } 
    } 
} 

Fehler: --------- Anfang Absturz

08-04 05:53:11.807 2667-2667/com.example.kwei.minigame1 E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.kwei.minigame1, PID: 2667 java.lang.NullPointerException: Attempt to invoke interface method 'void com.example.kwei.minigame1.AsyncResponse.processFinish()' on a null object reference at com.example.kwei.minigame1.BackgroundTask.onPostExecute(BackgroundTask.java:132) at com.example.kwei.minigame1.BackgroundTask.onPostExecute(BackgroundTask.java:26) at android.os.AsyncTask.finish(AsyncTask.java:636) at android.os.AsyncTask.access$500(AsyncTask.java:177) at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:653) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5254) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

+0

"stoppt leider" bedeutet, dass es ein logcat gibt. Bitte fügen Sie es in die Frage ein –

+0

Ihr _delegate_ ist null – Piyush

+0

Aber ich habe backgroundTask.delegate = this; in login.class –

Antwort

1

Ihre

AsyncResponse delegate = null;

delegate null ist. Sie haben das nicht initialisiert!

Edit:

Fabrikat Konstruktor

public AsyncResponse delegate; 

    public BackgroundTask(AsyncResponse delegate){ 
    this.delegate = delagate; 
    } 

Jetzt ist Ihre async Aufgabe ausführen mit

BackgroundTask backgroundTask = new BackgroundTask(new AsyncResponse()......); 
    backgroundTask.delegate = this;// Comment this 
    backgroundTask.execute("login",user_ac_s,user_pw_s); 

this Schlüsselwort definiert den Kontext der Aktivitäten in Ihrem Fall, aber eigentlich müssen Sie dafür zu bekommen, AsyncResponse.

+0

Wie wäre es mit backgroundTask.delegate = das im Klassen-Login; –

+0

_dies_ bedeutet was? Sie müssen Ihren Delegaten an asynchrone Konstruktor übergeben – Piyush

+0

backgroundTask.delegate = das Ändern der Variablen Delegate in Objekt BackgroundTask, nicht wahr? –

Verwandte Themen