【问题标题】:Null pointer Error in Async Task异步任务中的空指针错误
【发布时间】:2013-08-26 11:32:55
【问题描述】:

我在处理 JSON 数据时遇到空指针异常,我检查了我得到的 JSON 是否正确。此外,我想将此数据存储在哈希图中并根据要求一一检索。

    public ProgressDialog pDialognew;
static JSONParser jParser = new JSONParser();
ArrayList<HashMap<String, String>> allValueList;

class SearchData extends AsyncTask<String, String, String> {
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialognew = new ProgressDialog(Activity.this);
        pDialognew.setMessage("Loading. Please wait...");
        pDialognew.setIndeterminate(false);
        pDialognew.setCancelable(true);
        pDialognew.show();
}
@Override
protected String doInBackground(String... params) {
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            int success;
try 
{
    List<NameValuePair> params = new ArrayList<NameValuePair>();
    params.add(new BasicNameValuePair("match",pName));

    JSONObject json = jParser.makeHttpRequest(GlobalServerLocation.url_pol, "GET", params);
    success = json.getInt("success");
    if (success == 1) 
    {
    JSONArray productObj = json.getJSONArray("object"); // JSON Array
    Log.i("val", productObj.toString());    // Correct JSON
    total = productObj.length();        // Correct number of rows
    Log.i("Len", String.valueOf(total));
    for (int j = 0; j < productObj.length(); j++) 
        {
        JSONObject productnew = productObj.getJSONObject(j);
        String LS = productnew.getString(TAG_LS);
        String CN = productnew.getString(TAG_CN);
        String SN = productnew.getString(TAG_SN);
        String PN = productnew.getString(TAG_PN);

        HashMap<String, String> map = new HashMap<String, String>();
        map.put(TAG_LS, LS);
        map.put(TAG_CN, CN);
        map.put(TAG_SN, SN);
        map.put(TAG_PN, PN);
        allValueList.add(map);
        }
    }
    else
    {
        Log.i("Error", " Some Error from Php Script");
    }
}
catch (JSONException e) 
    {
    Log.i("Error", e.toString());
    }

}
    });
    return null;
}
@Override
protected void onPostExecute(String file_url) {
    pDialognew.dismiss();   // Line 113

    }
}

08-23 17:17:33.449: E/AndroidRuntime(31930): FATAL EXCEPTION: main
08-23 17:17:33.449: E/AndroidRuntime(31930): java.lang.NullPointerException
08-23 17:17:33.449: E/AndroidRuntime(31930):    at my.india.our.app$SearchData$1.run(app.java:113)
08-23 17:17:33.449: E/AndroidRuntime(31930):    at android.os.Handler.handleCallback(Handler.java:587)
08-23 17:17:33.449: E/AndroidRuntime(31930):    at android.os.Handler.dispatchMessage(Handler.java:92)
08-23 17:17:33.449: E/AndroidRuntime(31930):    at android.os.Looper.loop(Looper.java:123)
08-23 17:17:33.449: E/AndroidRuntime(31930):    at android.app.ActivityThread.main(ActivityThread.java:3729)
08-23 17:17:33.449: E/AndroidRuntime(31930):    at java.lang.reflect.Method.invokeNative(Native Method)
08-23 17:17:33.449: E/AndroidRuntime(31930):    at java.lang.reflect.Method.invoke(Method.java:507)
08-23 17:17:33.449: E/AndroidRuntime(31930):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:874)
08-23 17:17:33.449: E/AndroidRuntime(31930):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:632)
08-23 17:17:33.449: E/AndroidRuntime(31930):    at dalvik.system.NativeStart.main(Native Method)

如果需要代码的任何其他部分,请告诉我。

【问题讨论】:

  • app.java第113行代码的哪一部分
  • pDialognew.dismiss(); // 这是第 113 行
  • 似乎 pDialognew 不是一个对象,在 postexecute 执行之前是否有其他访问/关闭/销毁它
  • 为什么这个标签是php?

标签: android json exception android-asynctask


【解决方案1】:

通常 AsyncTask 被用作新线程来执行繁重的操作而不会阻塞主 UI 线程。但是,您使用了我在下面提到的 AsyncTask 的 doInBackground() 中的代码,这将再次使进程在主线程中执行(尤其是在更高版本的手机中),阻止它。所以,最好删除以下行并尝试运行它..

runOnUiThread(new Runnable() {
        @Override
        public void run() {

}
};

【讨论】:

    【解决方案2】:

    一个 AsyncTask 有几个部分:一个 doInBackground 方法,实际上是在一个单独的线程上运行,一个 onPostExecute 方法在 UI 线程上运行。 onPostExecute 的目的是发布必须在 UI 线程上完成的结果(例如更新视图层次结构,或在文本视图中设置文本)。它还可以发布进度更新。为了使这一切正常工作,必须在 UI 线程上创建 AsyncTask 并调用 execute 方法。

    您不得在 doInBackground 中调用 UI 操作 - 这样做会使您的应用程序崩溃。

    【讨论】:

    • 感谢您的回复,但如果还可以指出我在上面代码中的错误,我将不胜感激。我所做的只是获取数据并放入哈希图,而且我已经做了很长时间了。
    【解决方案3】:

    首先,将pDialognew 的声明移动到您的SearchData 类中。

    第二,正如 Hari 指出的,摆脱 runOnUiThread 的东西。您的 doInBackground() 方法应该如下所示:

    protected String doInBackground(String... params) {
        try {
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            // ... rest of your code
        } catch (JSONException e) {
            Log.i("Error", e.toString());
        }
        return null;
    }
    

    第三,在你的 onPostExecute() 方法中,确保 pDialognew 不为空(虽然我不知道它怎么可以在这里为空):

    if (pDialognew != null) pDialognew.dismiss();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-24
      • 1970-01-01
      • 2014-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多