2017-01-18 1 views
0

Ich habe eine Anwendung, die eine Asynctask für Web-API-Anfragen hat und es gibt viele Anfrage für viele Registerkarten.Asynctask Ergebnis kommen, nachdem activty geschlossen ist und zum Absturz

Wenn Benutzer sehr schnell zwischen den Tabs scrollt viele Anfragen Mittagessen! Wenn der Benutzer die Aktivität jedoch schließt, führen einige Vorgänge im Hintergrund zu Abstürzen von Apps.

ich das versucht: in meinem doinBackground ich immer überprüfen, ob Fragment isAdded()

@Override 
protected Void doInBackground(Void... Params) { 
Bundle bundle = getArguments(); 
String url = ServiceHandler.serverEnum.serverRootPath + ServiceHandler.serverEnum.Me.toString(); 


if(isAdded()){ 
      response = StaticUtils.generateReguest(mContext, url, headerParams, bodyParams, URLParams, null, ServiceHandler.serviceMethod.get.toString()); 
     } 

    return null; 
} 

ich dies auch tun, wenn AsyncTask von Aktivität läuft: OnStop Aktivitäts abgesagt ich das RAN Asyctask dann onPostExecute davon überprüfen Sie, ob nicht abgebrochen werden einige UI-Sachen. aber Problem ist, dass ich in doInBackground Crash bekomme.

das ist die Linie, den Absturz in StaticUtils.generateReguest bei der Schaffung reagieren passiert:

if (status != 200 && status != 401 && status != 404 && status != 0) { 
      Intent intent = new Intent(context, ErrorActivity.class); //error point to this line 
      intent.putExtra(ErrorActivity.REASON, "SERVER"); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      (context).startActivity(intent); 
     } 

und das ist log Katze, die über die Linie führen:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference 

Ich denke, es kann wegen des Kontextes. Wenn ich eine Anfrage erstelle, übergebe ich den Aktivitätskontext an Requestgenerator, und irgendwann, wie Sie im Code sehen, führt dies zu einer Fehleraktivität. Wenn der Benutzer geschlossen wird, ändert sich der Aktivitätskontext so, dass der Request-Generator 'ErrorActivity' nicht öffnen kann. Was ist die beste Vorgehensweise, um damit umzugehen? Ich habe gegoogelt und konnte keine gute Lösung finden?

+0

sollten Sie das gleiche auch in onPause der Aktivität tun. – Shuddh

+0

Absturz passiert auf doingBackground! – Kenji

+0

können Sie mir die Protokolle geben – Shuddh

Antwort

0

Ich denke, Kontext ist null. Warum haben Sie keinen Null-Check für den Kontext.

 if(context != null){ 
      Intent intent = new Intent(context, ErrorActivity.class); 
      intent.putExtra(ErrorActivity.REASON, "SERVER"); 
      intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
      (context).startActivity(intent); 
     } 
0

Ihre context ist null, ich bin mir nicht sicher, wie Sie den Kontext übergeben. Aber ich würde auf diese Weise empfehlen,

public class YourActivity extends Application{ 
    Context appContext; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_two); 
     appContext=getApplicationContext(); 
MyAsynchClass mAsynch= new MyAsynchClass(appContext); 
mAsynch.execute(); 
    } 

Und verwenden Sie dann, dass appContext von Ihrem Konstruktor.

Wenn die oben nicht funktioniert, dann diese,

From this users answer,

<application android:name="com.xyz.MyApplication"> 

</application> 

public class MyApplication extends Application { 

    private static Context context; 

    public void onCreate() { 
     super.onCreate(); 
     MyApplication.context = getApplicationContext(); 
    } 

    public static Context getAppContext() { 
     return MyApplication.context; 
    } } 
+0

Ich mache so etwas. Lesen Sie die Frage noch einmal. mitten in der Asynctask-Aktivität ändert sich – Kenji

0

1) an dieser Stelle einen Debugger Punkt Setzen und prüfen, welche Variable null erhält. Sieht aus wie sein Kontext, der null ist, aber immer noch das es einmal überprüft.

2) Wenn diese doesnot Arbeit, verwenden die gleiche Funktion dh

if (status != 200 && status != 401 && status != 404 && status != 0) { 
    Intent intent = new Intent(context, ErrorActivity.class); 
     intent.putExtra(ErrorActivity.REASON, "SERVER"); 
     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
     startActivity(intent); 
    } 

in der Post exceute. Ich bin mir nicht sicher, aber da im Hintergrund arbeiten im Hintergrund Thread und nicht auf UI-Thread ist es nicht in der Lage, die UI-Verarbeitungen zu verarbeiten.

Verwandte Themen