我注意到某些设备在AsyncTask中发生崩溃的问题。在我的平板电脑和智能手机上它可以正常工作,但是我的朋友的设备上有问题。

这是我的一个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;
}


日志:

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,该URL是在方法内部设置的,并借助于GlobalValues.getServiceUrl()和params []。会话cookie存储在HttpContext中,该HttpContext从GlobalValues.getLocalContext()中检索,该HttpContext是在我的所有AsyncTasks首次启动并共享应用程序时设置的。我不知道可能在哪里抛出NullPointerException。

我查看了其他问题/答案,但没有找到解决方案。


LocalContext是共享的
在HttpResponse响应= httpclient.execute(httppost,GlobalValues.getLocalContext())中关闭InputStream。


之前是否有人遇到过&//知道可能是什么问题?

编辑:

启动器活动-

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)重新实例化变量”,我已停止了应用程序的崩溃。但是,存储在LocalContext中的会话cookie将丢失。有什么想法如何在不丢失数据的情况下重新实例化值或变量?

最佳答案

该行中的NullPointerException表示httpclient已经是null-从您的代码中指向GlobalValues.getHttpClient(),该staticonCreate字段读取。

您可以在另一个活动的GlobalValues方法中实例化静态字段。这将不起作用,因为android可能会杀死您的应用并仅重新创建可见活动。在这种情况下,不会调用您的初始化代码。



快速修复:更改您的GlobalValues类以进行初始化工作:

protected static DefaultHttpClient httpclient = new DefaultHttpClient();




您的GlobalValues类似乎有点像您尝试了“ Singleton模式”,请参见an answer about singleton patterns in general,然后将所有构造代码移到构造函数中。这样,在使用静态功能之前,将调用所有构造代码。

10-08 00:13