2013-08-23 2 views
4

JSON 데이터를 처리하는 동안 널 포인터 예외가 발생합니다. JSON이 올바른지 확인했습니다. 추가로이 데이터를 해시 맵에 저장하고 요구 사항에 따라 하나씩 검색하려고합니다. 코드의 다른 부분이 필요한 경우 Null 포인터 비동기 작업의 오류

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) 


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 

    } 
} 
은 알려주세요.

+0

무엇 코드의 일부는 app.java의 113 행입니다 –

+0

pDialognew.dismiss(); // this is line 113 – user2327124

+0

'pDialognew'가 객체가 아닌 것 같습니다. postexecute가 실행되기 전에 다른 사람이 액세스/해체/파기합니다. –

답변

1

일반적으로 AsyncTask는 메인 UI 스레드를 차단하지 않고 많은 작업을 수행하는 새 스레드로 사용됩니다.하지만 아래에서 언급 한 코드를 AsyncTask의 doInBackground() 안에 사용했습니다.이 코드는 다시 주 스레드에서 수행됩니다 특히 더 높은 버전의 모바일에서). 별도의 스레드에서 실행 실제로 않는 doInBackground 방법 및 UI에서 실행되는 onPostExecute 방법 : 그래서, 더 나은

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

} 
}; 
0

AsyncTask를 여러 부분으로 구성되어 있습니다 .. 다음 줄을 제거하고 실행 해보십시오 실. onPostExecute의 목적은 UI 스레드에서 수행해야하는 결과 (예 : 뷰 계층 업데이트 또는 텍스트보기의 텍스트 설정)를 게시하는 것입니다. 또한 진행 상황 업데이트를 게시 할 수 있습니다. 이 작업을 제대로 수행하려면 UI 스레드에서 AsyncTask를 만들어야하고 execute 메서드가 호출되어야합니다.

doInBackground 내에서 UI 작업을 호출하면 안됩니다. 그렇게하면 응용 프로그램이 중단됩니다.

+0

귀하의 답변에 감사 드리며, 위의 코드에서 실수를 지적 할 수 있다면 감사하겠습니다. 내가 한 것은 데이터를 가져 와서 해시 맵을 넣는 것뿐입니다. 그리고 오랫동안 똑같이 해왔습니다. – user2327124

0

먼저 pDialognew의 선언을 SearchData 클래스로 옮깁니다.

둘째, 하리가 지적한대로 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가 null는 아니고, (나는 여기에 null이 될 수있는 방법을 아무 생각이 없다 입력해도) :

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