0

我注意到在AsyncTask中發生崩潰的某些設備上存在問題。它在我的平板電腦和智能手機上沒有問題,但我的朋友在他的設備上遇到問題。Android - AsyncTask上的RuntimeException

這是我的AsyncTasks中的一個的主體的實例:

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

LOG:

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包含服務器url,它是在GlobalValues.getServiceUrl()和params []的幫助下在方法內部設置的。會話cookie存儲在一個HttpContext中,它是從GlobalValues.getLocalContext()中檢索的,當應用程序第一次啓動並由我的所有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); 

GlobalValues -

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會丟失。任何想法如何重新實例化值或變量而不會丟失數據?

+0

該行中的'NullPointerException'意味着'httpclient'已經'null' - 從您的代碼指向'GlobalValues.getHttpClient()'。你能給我們來源嗎? – dst

+0

我忘了HttpClient - 我已經按照你的要求添加了代碼段 – lgdroid57

回答

1

在該行的NullPointerException意味着httpclient一直null製造商 - 從你的代碼點GlobalValues.getHttpClient(),從一個static場讀取。

你instanciate你的靜態字段onCreate方法另一個活動。這將不是工作,因爲android可能會殺死你的應用程序,並重新創建只有可見的活動。在這種情況下,您的初始化代碼不會被調用。


快速修復:更改GlobalValues類做初始化工作:

protected static DefaultHttpClient httpclient = new DefaultHttpClient(); 

GlobalValues類似乎有點像你嘗試了 「Singleton模式」,見an answer about singleton patterns in general,和將所有施工代碼移至GlobalValues構造函數中。這樣,在使用靜態特徵之前調用所有構造代碼。

+0

感謝你的建議 - 我會試試看。 – lgdroid57

+0

仍然遇到問題... – lgdroid57

+0

@ lgdroid57有什麼問題? logcat的? – dst

0

您的GlobalValues是否有可能被另一個異步進程踩踏?

另外,並非所有的Android都是相同的。你的朋友可能有一個電話從實現的AsyncTask不同足以引起問題

相關問題