2014-06-17 156 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" 

另外别忘了来捕获异常之前。有时互联网在获取信息时发生故障。因此更好地捕捉异常。

相关问题