一部のデバイスで、AsyncTask でクラッシュが発生する問題に気付きました。私のタブレットとスマートフォンでは問題なく動作しますが、友人のデバイスで問題が発生しました。
これは、私の AsyncTasks の 1 つの本体の例です。
protected String doInBackground(String... params) {
String result = "";
HttpClient httpclient = GlobalValues.getHttpClient();
HttpPost httppost = new HttpPost(String.format(GlobalValues.getServiceUrl() + "%s", params[0]));
try {
HttpResponse response = httpclient.execute(httppost, GlobalValues.getLocalContext());
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream instream = entity.getContent();
result = GlobalValues.convertStreamToString(instream);
Log.i(params[0], params[0] + ": " + result);
}
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
ログ:
FATAL EXCEPTION: AsyncTask #1
java.lang.RuntimeException: An error occured while executing doInBackground()
...
Caused by: java.lang.NullPointerException
...
エラーは次の行で発生します。
HttpResponse response = httpclient.execute(httppost, GlobalValues.getLocalContext());
httppost には、GlobalValues.getServiceUrl() および params[] の助けを借りて、メソッド内で設定されるサーバー URL が含まれています。セッション Cookie は、GlobalValues.getLocalContext() から取得される HttpContext に格納され、アプリケーションが最初に起動され、すべての AsyncTasks によって共有されるときに設定されます。NullPointerException がスローされる可能性がある場所がわかりません。
他の質問/回答を見ましたが、解決策が見つかりませんでした。
- LocalContext は共有されます
- InputStream は HttpResponse 応答 = httpclient.execute(httppost, GlobalValues.getLocalContext()) で閉じられます。
以前にこれに遭遇した人はいますか? &/ 何が問題なのか知っていますか?
編集:
ランチャー アクティビティ -
private DefaultHttpClient httpclient;
private HttpContext localContext;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
httpclient = new DefaultHttpClient();
localContext = new BasicHttpContext();
CookieStore cookieStore = new BasicCookieStore();
localContext.setAttribute(ClientContext.COOKIE_STORE, cookieStore);
GlobalValues.setHttpClient(httpclient);
GlobalValues.setLocalContext(localContext);
グローバル値 -
protected static DefaultHttpClient httpclient;
protected static HttpContext localContext;
public static final DefaultHttpClient getHttpClient() {
return httpclient;
}
public static final HttpContext getLocalContext() {
return localContext;
}
public static final void setHttpClient(DefaultHttpClient httpclient) {
GlobalValues.httpclient = httpclient;
}
public static final void setLocalContext(HttpContext localContext) {
GlobalValues.localContext = localContext;
}
更新: この問題は、誰かがアプリケーションを復元しようとしたときにのみ発生することがわかりました。GlobalValues.getHttpClient() と GlobalValues.getLocalContext() に「if(null) re-instantiate variable」を追加することで、アプリケーションがクラッシュしないようにしました。ただし、LocalContext に保存されているセッション Cookie は失われます。データを失うことなく値または変数を再インスタンス化する方法はありますか?