java - Android - AsyncTask 上的 RuntimeException

标签 java android android-asynctask nullpointerexception runtimeexception

我注意到某些设备上存在 AsyncTask 发生崩溃的问题。它在我的平板电脑和智能手机上运行没有问题,但我的 friend 在他的设备上遇到了问题。

这是我的一个 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[] 的帮助下在方法内设置。 session cookie 存储在 HttpContext 中,该 HttpContext 从 GlobalValues.getLocalContext() 检索,在应用程序首次启动时设置并由我的所有 AsyncTasks 共享。我不明白 NullPointerException 可能会在哪里抛出。

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

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

有人以前遇到过这个问题并且/知道可能是什么问题吗?

编辑:

启动器 Activity -

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

全局值(value) -

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 中的 session cookie 会丢失。有什么想法如何在不丢失数据的情况下重新实例化值或变量吗?

最佳答案

该行中的 NullPointerException 意味着 httpclient 已为 null - 从您的代码中指向 GlobalValues.getHttpClient() ,从静态字段读取。

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

<小时/>

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

protected static DefaultHttpClient httpclient = new DefaultHttpClient();
<小时/>

您的 GlobalValues 类看起来有点像您尝试过“单例模式”,请参阅 an answer about singleton patterns in general ,并将所有构造代码移至 GlobalValues 构造函数中。这样,您的所有构造代码都会在使用静态功能之前被调用。

关于java - Android - AsyncTask 上的 RuntimeException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18541625/

相关文章:

java - Spring MVC 3 - 使用 404 响应请求?

android - 在 Android 游戏中显示文本

java - AsyncTask 可变参数的用途

Android:WAITING服务器响应

java - For 循环内的 Firestore 查询

java - 如果我在 Java 中截断文件, "removed"字节会发生什么?

java - PersistanceUnit 注解不注入(inject)

android - 尝试在内存中捕获图像的 CameraX 问题

android - 为什么将存储库添加到 build.gradle 会使其找不到依赖项?

使用 android + mongodb 时出现 java.net.UnknownHostException : Unable to resolve host "@MYIPADDRESS,