2016-10-30 4 views
-2

Grundsätzlich verwende ich AsyncTask eine progressBar zu zeigen, und nach dem progress ist 10, sollte es ein Verfahren ausgeführt werden, die in MainActivity befindet. Wenn die progressBar10/10 ist, führt dies zu einem Absturz beim folgenden Fehler.OnPostExecute nicht Intent öffnen

java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.pm.ApplicationInfo android.content.Context.getApplicationInfo()' on a null object reference

MapProgressTask

@Override 
protected void onPostExecute(String result) { 
    textView.setText(result); 
    button.setEnabled(true); 
    progressDialog.hide(); 
    MainActivity mainActivity = new MainActivity(); 
    mainActivity.getGooglePlace(); 
} 

MainActivity

protected void getGooglePlace() 
    { 
     PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder(); 
     Intent intent; 
     try { 
      intent = builder.build(MainActivity.this); 
      startActivityForResult(intent, place_picker_request); 
     } catch (GooglePlayServicesRepairableException e) { 
      e.printStackTrace(); 
     } catch (GooglePlayServicesNotAvailableException e) { 
      e.printStackTrace(); 
     } 
    } 

Können Sie mir sagen, wie kann ich diese Methode ausgeführt werden, wenn die progressBar voll ist, bitte? Vielen Dank!

+1

MainActivity mainActivity = neu MainActivity() ;? Was versuchst du zu machen? – Vardan95

+1

Versuchen Sie niemals, Ihre Aktivität instanziieren, um eine Methode innerhalb dieser Aktivität auszuführen. Erstellen Sie diese Methode in einer öffentlichen getrennten Klasse .... – Opiatefuchs

+0

** Erstellen Sie nie eine Instanz einer Aktivität selbst. Löschen Sie zuerst diese Zeilen: 'MainActivity mainActivity = new MainActivity(); mainActivity.getGooglePlace(); '. Entscheiden Sie sich dann für einen besseren Plan zum Starten dieser anderen Aktivität (z. B. "statische" Methode, die einen "Kontext" als einen Parameter verwendet). Berücksichtigen Sie die Möglichkeit von Konfigurationsänderungen, während Ihre AsyncTask ausgeführt wird (z. B. wenn der Benutzer den Bildschirm dreht). – CommonsWare

Antwort

2

In Ihrem OnPostExecute Ereignisse, müssen Sie einen Flag hinzuzufügen, bevor die Aktivität starten, wenn Sie die Aktivität aus einer nicht-Aktivitätsklasse beginnen:

protected void getGooglePlace() 
{ 
    PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder(); 
    Intent intent; 
    try { 
     intent = builder.build(MainActivity.this); 
     intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); //Needed when starting an activity from a non-activity class 
     startActivityForResult(intent, place_picker_request); 
    } catch (GooglePlayServicesRepairableException e) { 
     e.printStackTrace(); 
    } catch (GooglePlayServicesNotAvailableException e) { 
     e.printStackTrace(); 
    } 
} 
+0

Ich glaube nicht, dass 'FLAG_ACTIVITY_NEW_TASK' für diesen Fall benötigt wird. Das ist notwendig, wie Ihre Bemerkung zeigt, wenn die Aktivität durch einen Nicht-Aktivitäts-Kontext gestartet wird, und wir haben keine Beweise, dass dies der Fall ist. – CommonsWare

0

In meiner Sicht gibt es keine Notwendigkeit, um deine Aktivität zu instanziieren. Wie es eine schlechte Entscheidung ist. Sie können Ihre asynchrone Aufgabe als geschachtelte Klasse in Ihre Aktivität aufnehmen und die Methode getGooglePlace() aufrufen. Dies ist jedoch auch eine schlechte Idee. Ich würde den folgenden Ansatz vorschlagen.

public class MyTask extends AsyncTask<Void, Void, Void> { 
    private WeekReference<MyListener> mListener; 

    public MyTask(MyListener listener) { 
     mListener= new WeakReference<MyListener>(listener); 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     super.onPostExecute(result); 
     MyListener activity = mListener.get(); 
     if (activity != null) { 
     // do your stuff with activity here 
     } 
    } 
    }