2017-01-18 2 views
0

Web Api RequestsにはAsynctaskのアプリケーションがあり、たくさんのタブがたくさんリクエストされています。アクティビティが閉じられてクラッシュするようになると、Asynctaskの結果が来る

ユーザーがタブ間で非常に高速にスクロールすると、多くのリクエストランチが発生します。ユーザーがアクティビティを閉じると、バックグラウンドでいくつかの進行中のdoがアプリクラッシュを引き起こします。

私はこの試みた:活動の onStopを、私はそれのonPostExecuteを走っAsyctaskをキャンセル:私もAsynctaskがActivityから実行したときにこれを行う)フラグメントはisAdded場合、私はいつも(チェック私のdoinBackgroundに

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

を をキャンセルされていないかどうか確認してください。しかし問題は私がdoInBackgroundにクラッシュすることです。

この

はクラッシュが StaticUtils.generateReguestに応じる作成に起こるラインである:

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

、これは上の行につながるログ猫です:

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

私はそれが理由文脈のかもしれないと思います。私が要求を生成するとき、私はアクティビティコンテキストをRequestgeneratorに渡し、コードではエラーアクティビティを表示するようにします。ユーザがアクティビティコンテキストを変更したときに、RequestジェネレータがErrorActivityを開けないように変更したとき。これを処理するベストプラクティスは何ですか?私はグーグルで、良い解決策を見つけることができませんでしたか?

+0

あなたはアクティビティのonPauseでも同じことをする必要があります。 – Shuddh

+0

OnBackgroundを実行するとクラッシュが発生します。 – Kenji

+0

あなたは私にログを与えることができます – Shuddh

答えて

0

私はコンテキストがnullだと思います。 なぜコンテキストのヌルチェックがないのですか?

 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

contextがnullの場合、どのようにコンテキストを渡しているか分かりません。しかし、私はこの方法をお勧めします

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

あなたのコンストラクタからそのappContextを使用してください。

上記のは、この、

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

私はこのようなことをしています。もう一度質問を読んでください。 Asynctaskアクティビティの変更の途中で – Kenji

0

1)その場所でデバッガポイントを入れて、ヌルなっているどの変数チェックを使用して動作しない場合。ヌルですが、それでも一度それをチェックするコンテキストのように見えます。

2)このdoesnotの仕事であれば、ポストexceuteで

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

すなわち、同じ機能を使用しています。私は確信していませんが、以来バックグラウンドのスレッドではなく、UIのスレッドでUIの処理を処理することはできませんで動作します。

関連する問題