2014-06-25 34 views
0

我似乎無法解決我遇到的這個問題。在我的MainActivity中,我使用幾個Asynctasks將我的設備的應用程序數據庫與後端數據庫同步,每個表都有一個。因爲我有很多不同的表,我對的AsyncTask的一般設置,並通過在確定這樣的同步處理的表中的參數:AsyncTask中的JSONObject的問題

protected void onResume() { 
    if(isOnline()){ 
     new loadFromBackendAndPlaceInDB().execute(new Integer[]{ FORENINGAR }); 
     new loadFromBackendAndPlaceInDB().execute(new Integer[]{ INFO }); 
     new loadFromBackendAndPlaceInDB().execute(new Integer[]{ KALENDER }); 
     new loadFromBackendAndPlaceInDB().execute(new Integer[]{ KAMPEN }); 
     new loadFromBackendAndPlaceInDB().execute(new Integer[]{ KARTA }); 
     new loadFromBackendAndPlaceInDB().execute(new Integer[]{ KONTAKT }); 
     new loadFromBackendAndPlaceInDB().execute(new Integer[]{ MEDDELANDEN }); 
     new loadFromBackendAndPlaceInDB().execute(new Integer[]{ OVRIGINFO }); 
     new loadFromBackendAndPlaceInDB().execute(new Integer[]{ SANGBOK }); 
    } 
} 

實際的AsyncTask看起來像這樣:

class loadFromBackendAndPlaceInDB extends AsyncTask<Integer, String, String> { 

    protected String doInBackground(Integer... params) { 

     int activity = params[0]; 
     String url = urlList.get(activity); 
     String json = null; 

     try { 
      URL urlObject = new URL(url); 
      HttpURLConnection con = (HttpURLConnection) urlObject.openConnection(); 
      con.setConnectTimeout(15000); 
      con.setReadTimeout(15000); 
      json = readStream(con.getInputStream()); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     if(json != null){ 
      JSONObject jObj = null; 
      try { 
       // THIS IS WHERE I'M STARTING GETTING A PROBLEM 
       // LINE 536 
       jObj = new JSONObject(json); 
      } catch (JSONException e1) { 
       // TODO Auto-generated catch block 
       e1.printStackTrace(); 
      } 

      try { 

       // THIS IS WHERE THE RUNTIME ERROR OCCURS BECAUSE OF THE PROBLEM AT ROW 536 
       // LINE 546 
       int success = jObj.getInt(TAG_SUCCESS); 

       if (success == 1) { 
        JSONArray jsonArray = null; 
        jsonArray = jObj.getJSONArray(getActivityTag(activity)); 

        getContentResolver().delete(getContentUri(activity), null, null); 
        for (int i = 0; i < jsonArray.length(); i++) { 

         JSONObject c = jsonArray.getJSONObject(i); 

         ContentValues values = new ContentValues(); 
         for(int k = 0; k < getColumns(activity).size(); k++){ 
          String TAG = getTags(activity).get(k); 
          String VALUE = c.getString(TAG); 
          String COLUMN = getColumns(activity).get(k); 

          values.put(COLUMN, VALUE); 
         } 

         getContentResolver().insert(getContentUri(activity), values); 
        } 
       } else { 
        Log.d("No Success", getActivityTag(activity)); 
       } 


      } catch (JSONException e) { 
       e.printStackTrace(); 
      } 

     }else{ 

     } 

     return null; 
    } 

    protected void onPostExecute(String result) { 
     super.onPostExecute(result); 
    } 

} 

,這就是在的AsyncTask使用的方法readStream:

private String readStream(InputStream in) { 
    BufferedReader reader = null; 
    StringBuilder sb = null; 
    String json = ""; 
    try { 
     reader = new BufferedReader(new InputStreamReader(in)); 
     sb = new StringBuilder(); 
     String line = ""; 
     while ((line = reader.readLine()) != null) { 
      sb.append(line + "\n"); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     if (reader != null) { 
      try { 
       reader.close(); 
       in.close(); 
       json = sb.toString(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
    } 
    return json; 
} 

這是我的logcat:

06-25 18:43:18.089: W/System.err(3942): org.json.JSONException: End of input at character 0 of 
06-25 18:43:18.113: W/System.err(3942):  at org.json.JSONTokener.syntaxError(JSONTokener.java:446) 
06-25 18:43:18.113: W/System.err(3942):  at org.json.JSONTokener.nextValue(JSONTokener.java:93) 
06-25 18:43:18.113: W/System.err(3942):  at org.json.JSONObject.<init>(JSONObject.java:154) 
06-25 18:43:18.113: W/System.err(3942):  at org.json.JSONObject.<init>(JSONObject.java:171) 
06-25 18:43:18.113: W/System.err(3942):  at se.nollekollen.main.MainActivity$loadFromBackendAndPlaceInDB.doInBackground(MainActivity.java:536) 
06-25 18:43:18.113: W/System.err(3942):  at se.nollekollen.main.MainActivity$loadFromBackendAndPlaceInDB.doInBackground(MainActivity.java:1) 
06-25 18:43:18.113: W/System.err(3942):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
06-25 18:43:18.113: W/System.err(3942):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
06-25 18:43:18.117: W/System.err(3942):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
06-25 18:43:18.117: W/System.err(3942):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
06-25 18:43:18.117: W/System.err(3942):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
06-25 18:43:18.117: W/System.err(3942):  at java.lang.Thread.run(Thread.java:1019) 
06-25 18:43:18.121: W/dalvikvm(3942): threadid=13: thread exiting with uncaught exception (group=0x40015578) 
06-25 18:43:18.125: E/AndroidRuntime(3942): FATAL EXCEPTION: AsyncTask #5 
06-25 18:43:18.125: E/AndroidRuntime(3942): java.lang.RuntimeException: An error occured while executing doInBackground() 
06-25 18:43:18.125: E/AndroidRuntime(3942):  at android.os.AsyncTask$3.done(AsyncTask.java:200) 
06-25 18:43:18.125: E/AndroidRuntime(3942):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274) 
06-25 18:43:18.125: E/AndroidRuntime(3942):  at java.util.concurrent.FutureTask.setException(FutureTask.java:125) 
06-25 18:43:18.125: E/AndroidRuntime(3942):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308) 
06-25 18:43:18.125: E/AndroidRuntime(3942):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
06-25 18:43:18.125: E/AndroidRuntime(3942):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
06-25 18:43:18.125: E/AndroidRuntime(3942):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
06-25 18:43:18.125: E/AndroidRuntime(3942):  at java.lang.Thread.run(Thread.java:1019) 
06-25 18:43:18.125: E/AndroidRuntime(3942): Caused by: java.lang.NullPointerException 
06-25 18:43:18.125: E/AndroidRuntime(3942):  at se.nollekollen.main.MainActivity$loadFromBackendAndPlaceInDB.doInBackground(MainActivity.java:546) 
06-25 18:43:18.125: E/AndroidRuntime(3942):  at se.nollekollen.main.MainActivity$loadFromBackendAndPlaceInDB.doInBackground(MainActivity.java:1) 
06-25 18:43:18.125: E/AndroidRuntime(3942):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
06-25 18:43:18.125: E/AndroidRuntime(3942):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
06-25 18:43:18.125: E/AndroidRuntime(3942):  ... 4 more 

看來好像這個問題在線路536然後導致在線路546

最終runtimeerror誤差僅有時會出現啓動,有時它的罰款。看起來好像是在我快速輸入和輸入MainActivity時發生的 - 當我在整個應用程序中更慢地導航時,它通常很好。

發生了什麼,爲什麼會發生此錯誤,解決方案是什麼?感謝所有答案!

回答

0

我有問題瓦特/多AsyncTask腐敗對方(雖然我沒有看到任何明顯的錯誤在您的代碼)。

我通常的解決方案是在IntentService中有這樣的操作,並通過廣播意圖傳遞更新到Activity。

這意味着我在活動內部保留一個BroadcastReceiver來捕捉意圖並更新UI。

好運。

0

而不是觸發多個AsyncTask爲什麼不只是發送單個整數數組作爲參數爲一個和所有的值AsyncTask只是實現循環通過整數數組條目逐一循環。

+0

我試過這個,並且發生了同樣的問題 – jahed

+0

當你從你的activity的onResume方法發起調用時,當你導入/導出你的mainactivity時,它會導致多個調用初始化AsyncTask組,導致數據庫鎖定或導致運行時錯誤,這是不處理的東西。當你慢慢瀏覽整個應用程序時,你的asynctasks有足夠的時間執行和更新數據庫。所以我會建議,當數據庫更新開始時把一個進度對話框禁用任何用戶交互。 –