Android - AsyncTask上的RuntimeException

时间:2013-08-30 21:20:00

标签: java android android-asynctask nullpointerexception runtimeexception

我注意到在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;
}

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中,该HttpContext是从GlobalValues.getLocalContext()中检索的,在应用程序首次启动并由我的所有AsyncTasks共享时设置。我不明白可能抛出NullPointerException的位置。

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

  • 共享LocalContext
  • 在HttpResponse response = 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)re-instantiate variable”来阻止应用程序崩溃。但是,存储在LocalContext中的会话cookie将丢失。任何想法如何在不丢失数据的情况下重新实例化值或变量?

2 个答案:

答案 0 :(得分:1)

该行中的NullPointerException表示httpclientnull - 从您的代码中指向GlobalValues.getHttpClient(),其中static字段为onCreate字段。

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


快速修复:更改您的protected static DefaultHttpClient httpclient = new DefaultHttpClient(); 课程以进行初始化工作:

GlobalValues

您的GlobalValues课程似乎有点像您尝试了“单一模式”,请参阅an answer about singleton patterns in general,并将所有构造代码移动到{{1}}构造函数中。这样就可以在使用静态功能之前调用所有构造代码。

答案 1 :(得分:0)

您的GlobalValues是否可能被另一个异步进程踩到了?

此外,并非所有的机器人都是一样的。您的朋友可能有来自制造商的电话以不同的方式实施AsyncTask以导致问题