2014-06-17 161 views
1

我的繼承人logcat的錯誤strace的Android的線程應用程序崩潰時,有沒有互聯網連接的

06-17 10:50:59.578: E/AndroidRuntime(1899): FATAL EXCEPTION: AsyncTask #1 
06-17 10:50:59.578: E/AndroidRuntime(1899): java.lang.RuntimeException: An error occured while executing doInBackground() 
06-17 10:50:59.578: E/AndroidRuntime(1899):  at android.os.AsyncTask$3.done(AsyncTask.java:299) 
06-17 10:50:59.578: E/AndroidRuntime(1899):  at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) 
06-17 10:50:59.578: E/AndroidRuntime(1899):  at java.util.concurrent.FutureTask.setException(FutureTask.java:219) 
06-17 10:50:59.578: E/AndroidRuntime(1899):  at java.util.concurrent.FutureTask.run(FutureTask.java:239) 
06-17 10:50:59.578: E/AndroidRuntime(1899):  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
06-17 10:50:59.578: E/AndroidRuntime(1899):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
06-17 10:50:59.578: E/AndroidRuntime(1899):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
06-17 10:50:59.578: E/AndroidRuntime(1899):  at java.lang.Thread.run(Thread.java:856) 
06-17 10:50:59.578: E/AndroidRuntime(1899): Caused by: java.lang.NullPointerException 
06-17 10:50:59.578: E/AndroidRuntime(1899):  at com.merimasjid.prayertimes.hijri.FavouritePagePrayerTimes1$LoadTimes.doInBackground(FavouritePagePrayerTimes1.java:561) 
06-17 10:50:59.578: E/AndroidRuntime(1899):  at com.merimasjid.prayertimes.hijri.FavouritePagePrayerTimes1$LoadTimes.doInBackground(FavouritePagePrayerTimes1.java:1) 
06-17 10:50:59.578: E/AndroidRuntime(1899):  at android.os.AsyncTask$2.call(AsyncTask.java:287) 
06-17 10:50:59.578: E/AndroidRuntime(1899):  at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
06-17 10:50:59.578: E/AndroidRuntime(1899):  ... 4 more 

我有,當應用程序啓動後自動執行單一線程並且此線程裏面片段定義。該線從互聯網上抓取一些JSON數據和diplays它在屏幕上,應用程序工作正常時,數據連接或無線網絡連接上,但在沒有分組數據的,它只是崩潰啓動時,應用程序

class LoadTimes extends AsyncTask<String, String, String> { 

    /** 
    * Before starting background thread Show Progress Dialog 
    * */ 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     //pBar.setVisibility(View.VISIBLE); 
    } 


    protected String doInBackground(String... args) { 
     // Building Parameters 
     List<NameValuePair> params = new ArrayList<NameValuePair>(); 
    // params.add(new BasicNameValuePair("areaID","0")); 

     try{ 
     params.add(new BasicNameValuePair("MasjidID",String.valueOf(_appPrefs.getFavOneID()))); 
     params.add(new BasicNameValuePair("Date", getParameterisedDate())); 
     //params.add(new BasicNameValuePair("date",getParameterisedDate())); 
     }catch(Exception e){} 
     JSONObject json = null; 
     try{ 
     json = jsonParser.makeHttpRequest(URL_GET_TIMES, "GET", 
       params); 
     }catch(Exception e){} 

     // Check your log cat for JSON response 
     Log.d("Outbox JSON: ", json.toString()); 
     SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss"); 

     try { 

      albums = json.getJSONArray("masjids"); 
      // looping through All messages 

      if(albums!=null){ 
      for (int i = 0; i < albums.length(); i++) { 
       JSONObject c = albums.getJSONObject(i); 

         Date d1 = df.parse(c.getString("FajarAzan")); 
         SunrH = d1.getHours(); 
         SunRM = d1.getMinutes(); 

         Date d2 = df.parse(c.getString("FajarAzan")); 
         fajrH = d2.getHours(); 
         fajrM = d2.getMinutes(); 

         Date d3 = df.parse(c.getString("ZoharAzan")); 
         DhuhrH = d3.getHours(); 
         DhuhrM = d3.getMinutes(); 

         Date d4 = df.parse(c.getString("AsarAzan")); 
         AsrH = d4.getHours(); 
         AsrM = d4.getMinutes(); 

         Date d5 = df.parse(c.getString("Maghrib")); 
         MaghribH = d5.getHours(); 
         MaghribM = d5.getMinutes(); 


         Date d6 = df.parse(c.getString("IshaAzan")); 
         IshaH = d6.getHours(); 
         IshaM = d6.getMinutes(); 


         _appPrefs.storeFavouriteMasjidTimes(fajrH, fajrM, SunrH, SunRM, DhuhrH, DhuhrM, AsrH, AsrM, MaghribH, MaghribM, IshaH, IshaM, day, month, year, _appPrefs.getFavOneID()); 
        try{ 
         initNamazTimes(); 
        }catch(Exception e){} 
        /* 
         namazTimesH = new int[]{fajrH,SunrH,DhuhrH,AsrH,MaghribH,IshaH}; 
         namazTimesM = new int[]{fajrM,SunRM,DhuhrM,AsrM,MaghribM,IshaM};*/ 

      } 
      } 
     } catch (Exception e) { 
     // pBar.setVisibility(View.GONE); 
     // 
     // cantGet = true; 
      publishProgress(null); 
      Log.e("Exception while Loading Times",e.toString()); 
     } 

     return null; 
    } 

    @Override 
    public void onProgressUpdate(String... args) { 
     super.onProgressUpdate(args); 
     try{ 
     FetchStoreFavouriteNamazTimings.cantGetNamazTimes();}catch(Exception e){} 

    } 
    protected void onPostExecute(String file_url) { 
    if(cantGet) 
     { 
      FetchStoreFavouriteNamazTimings.cantGet = false; 
     } 
     else{ 
      try{ 
      generateButtonsAlarms(); 
      generateButtonsFavourites();} 
      catch(Exception e){} 
      ///////////////////////////////////////////////////////////////////// 
     } 
    } 

} 
+0

發佈崩潰日誌將有助於... – elmorabea

回答

3
JSONObject json = null; 

try{ 
    json = jsonParser.makeHttpRequest(URL_GET_TIMES, "GET", params); 
}catch(Exception e){ 
    // handle me! 
} 

你說沒有互聯網連接,所以可能會有異常提出,你沒有處理。稍後,您訪問json對象,肯定是null

UPDATE:

大多數其他的答案的建議,檢查執行的AsyncTask之前的互聯網連接。但這不是一個完整的解決方案,因爲在「檢查」之後和網絡調用之前連接可能會丟失,這會導致相同的異常。

您必須處理異常!檢查互聯網連接不能解決問題。

+0

因爲我已經粘貼了代碼,還有狀態檢查是否json爲空或者沒有(如果(專輯!= null){int i = 0; i user3671032

+0

它檢查專輯,而不是json :)在使用它之前,您還應該檢查json。 – kupsef

0

請在調用類的.execute()方法之前檢查網絡連接。

嘗試此方法並在if條件中調用此函數,如果其返回true,則調用Asyncktask類,否則顯示一些警報消息。

public boolean isConnectingToInternet(){ 
     ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE); 
      if (connectivity != null) 
      { 
       NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
       if (info != null) 
        for (int i = 0; i < info.length; i++) 
         if (info[i].getState() == NetworkInfo.State.CONNECTED) 
         { 
          return true; 
         } 

      } 
      return false; 
    } 
0

你可以驗證,如果手機有wifi的連接

public static Boolean isWifiAvailable(Context context) 
    { 
     ConnectivityManager connManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo networkInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); 
     return networkInfo.isConnected(); 
    } 

不要忘了添加適當的permision在清單:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"> 
2

創建一個更class ConnectionDetector

public class ConnectionDetector { 

    private Context _context; 

    public ConnectionDetector(Context context){ 
     this._context = context; 
    } 

    public boolean isConnectingToInternet(){ 
     ConnectivityManager connectivity = (ConnectivityManager) _context.getSystemService(Context.CONNECTIVITY_SERVICE); 
      if (connectivity != null) 
      { 
       NetworkInfo[] info = connectivity.getAllNetworkInfo(); 
       if (info != null) 
        for (int i = 0; i < info.length; i++) 
         if (info[i].getState() == NetworkInfo.State.CONNECTED) 
         { 
          return true; 
         } 

      } 
      return false; 
    } 
} 

然後從你的活動首先聲明

ConnectionDetector cd = new ConnectionDetector(getApplicationContext()); 

調用的AsyncTask檢查互聯網連接

Boolean isInternetPresent = cd.isConnectingToInternet(); // true or false 

    if (isInternetPresent) 
    { 
     // call your AsyncTask 
    } 

    else 

    // display a toast message saying "No internet connection" 

另外別忘了來捕獲異常之前。有時互聯網在獲取信息時發生故障。因此更好地捕捉異常。

相關問題