Java Android-异步任务上的运行时异常

Java Android-异步任务上的运行时异常,java,android,android-asynctask,nullpointerexception,runtimeexception,Java,Android,Android Asynctask,Nullpointerexception,Runtimeexception,我注意到在异步任务中发生崩溃的某些设备上存在问题。它在我的平板电脑和智能手机上正常工作,但我朋友的手机出现了问题 下面是我的一个异步任务的主体示例: protected String doInBackground(String... params) { String result = ""; HttpClient httpclient = GlobalValues.getHttpClient(); HttpPost httppost = new HttpPost(Stri

我注意到在异步任务中发生崩溃的某些设备上存在问题。它在我的平板电脑和智能手机上正常工作,但我朋友的手机出现了问题

下面是我的一个异步任务的主体示例:

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;
}
日志:

错误发生在以下行中:

HttpResponse response = httpclient.execute(httppost, GlobalValues.getLocalContext());
httppost包含服务器url,该url在GlobalValues.getServiceUrl()和params[]的帮助下在方法内部设置。会话cookie存储在HttpContext中,HttpContext是从GlobalValues.getLocalContext()检索的,它是在应用程序首次启动时设置的,并由我的所有异步任务共享。我不明白NullPointerException可能会被抛出到哪里

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

  • 本地上下文是共享的
  • InputStream在HttpResponse response=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)重新实例化变量”,我已经阻止了应用程序崩溃。但是,存储在LocalContext中的会话cookie丢失。您知道如何在不丢失数据的情况下重新实例化值或变量吗?

是否有可能您的全局值被另一个异步进程踩到了


而且,并非所有的机器人都是一样的。您的朋友可能有一部来自制造商的手机,其执行AsyncTask的方式不同,足以引起问题。该行中的
NullPointerException
表示
httpclient
已被
null
-从您的代码指向
GlobalValues.getHttpClient()
,从
静态
字段读取

在另一个活动的
onCreate
方法中实例化静态字段。这是行不通的,因为android可能会杀死你的应用程序,只重新创建可见的活动。在这种情况下,不会调用初始化代码


快速修复:更改
全局值
类以执行初始化工作:

protected static DefaultHttpClient httpclient = new DefaultHttpClient();


您的
GlobalValues
类似乎有点像您尝试的“单例模式”,请参见,并将所有构造代码移动到
GlobalValues
构造函数中。这样,在使用静态特性之前,所有构造代码都会被调用。

该行中的
NullPointerException
表示
httpclient
已被
null
-从代码指向
GlobalValues.getHttpClient()
。你也能告诉我们它的来源吗?我忘记了HttpClient-我已经按照你的要求添加了代码段谢谢你的建议-我要试试。@lgdroid57什么问题?Logcat?同样的问题-位于“HttpResponse response=httpclient.execute(httppost,GlobalValues.getLocalContext());”的java.lang.NullPointerException@lgdroid57可能会尝试清理和重建?另外,在前面的行中记录
httpclient
,这样我们就可以确定它确实是
null
(从而导致异常),也可以记录
GlobalValues.getLocalContext()
(以防
NullPointerException
被抛出到android代码的某个地方,而logcat不知何故没有在堆栈跟踪中显示它).我现在看不到我朋友的日志,但我确实从他那里得到了一些有用的信息-听起来好像只有当他试图恢复应用程序时应用程序才会崩溃。我已经考虑过添加一行代码,上面写着if(HttpClient/LocalContext==null),然后重新配置HttpClient/LocalContext,但是我认为设置一个新的上下文会丢失会话cookie,对吗?
protected static DefaultHttpClient httpclient = new DefaultHttpClient();