2013-08-23 17 views
4

在處理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) 

如果需要代碼的任何其他部分讓我知道。

+0

什麼部分代碼是app.java的第113行 –

+0

pDialognew.dismiss(); //這是第113行 – user2327124

+0

似乎'pDialognew'不是一個對象,有些人在執行postexecute之前訪問/解僱/銷燬它 –

回答

1

通常情況下,AsyncTask被用作新線程來執行繁重的操作而不會阻塞主UI線程。但是,您已經使用了我在下面提到的AsyncTask的doInBackground()中的代碼,這將再次使進程在主線程中執行特別是在更高版本的手機中),阻止它。因此,更好地刪除下列行,並嘗試運行它..

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

} 
}; 
0

一個的AsyncTask有幾個部分組成:doInBackground方法呢,其實,在一個單獨的線程中運行,並且在UI上運行的onPostExecute方法線。 onPostExecute的目的是發佈必須在UI線程上完成的結果(例如更新視圖層次結構或設置文本視圖中的文本)。它也可以發佈進度更新。爲了使這一切正常工作,必須在UI線程上創建AsyncTask,並調用execute方法。

您不能在doInBackground中調用UI操作 - 這樣做會導致應用程序崩潰。

+0

我很感謝您的回覆,但是如果能夠在上面的代碼中指出我的錯誤,我將不勝感激。我所做的只是獲取數據並將其放入散列表中,而且我也一直在做相同的工作很長一段時間。 – user2327124

0

首先,將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不爲空(altough我不知道它是如何爲null這裏):

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