2015-06-07 84 views
0

我在我的android应用程序中获取json架构,它工作正常。但问题是如果互联网在获取数据的过程中中断,应用程序崩溃。我如何处理这个异常?应用程序崩溃,如果互联网中断在Android

我打电话给new LoadPlaces().execute();,然后在doInBackground方法中,这叫做googlePlaces.search(lat1, lon1, radius, types);,它获取json数据并将它分配给一个对象。

这是搜索方法

public PlacesList search(double latitude, double longitude, double radius, String types) 
     throws Exception { 

    this._latitude = latitude; 
    this._longitude = longitude; 
    this._radius = radius; 

    try { 

     HttpRequestFactory httpRequestFactory = createRequestFactory(HTTP_TRANSPORT); 
     HttpRequest request = httpRequestFactory.buildGetRequest(new GenericUrl(PLACES_SEARCH_URL)); 
     request.getUrl().put("key", API_KEY); 
     request.getUrl().put("location", _latitude + "," + _longitude); 
     request.getUrl().put("radius", _radius);       // in meters 
     request.getUrl().put("sensor", "false"); 
     if(types != null) 
      request.getUrl().put("types", types); 

     PlacesList list = request.execute().parseAs(PlacesList.class); 
     // Check log cat for places response status 
     Log.d("Places Status", "" + list.status); 
     return list; 

    } catch (HttpResponseException e) { 
     Log.e("Error:", e.getMessage()); 
     return null; 
    } 
} 

请不要回复此帮助我,这是最重要的我。我准备提供赏金,但请帮助我。感谢

logcat的

06-08 05:15:25.335 32008-32008/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
Process: com.example.atifarain.customizedcamera, PID: 32008 
java.lang.NullPointerException 
     at com.example.atifarain.customizedcamera.MainActivity$LoadPlaces$1.run(MainActivity.java:485) 
     at android.app.Activity.runOnUiThread(Activity.java:4757) 
     at com.example.atifarain.customizedcamera.MainActivity$LoadPlaces.onPostExecute(MainActivity.java:479) 
     at com.example.atifarain.customizedcamera.MainActivity$LoadPlaces.onPostExecute(MainActivity.java:446) 
     at android.os.AsyncTask.finish(AsyncTask.java:632) 
     at android.os.AsyncTask.access$600(AsyncTask.java:177) 
     at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:645) 
     at android.os.Handler.dispatchMessage(Handler.java:102) 
     at android.os.Looper.loop(Looper.java:136) 
     at android.app.ActivityThread.main(ActivityThread.java:5105) 
     at java.lang.reflect.Method.invokeNative(Native Method) 
     at java.lang.reflect.Method.invoke(Method.java:515) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:608) 
     at dalvik.system.NativeStart.main(Native Method) 

MainActivity

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

    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    protected String doInBackground(String... args) { 
     // creating Places class object 
     googlePlaces = new GooglePlaces(); 

     try { 
      // Separeate your place types by PIPE symbol "|" 
      // If you want all types places make it as null 
      //String types = "establishment|art_gallery|museum|place_of_worship"; 
      //String types = "art_gallery|museum"; 
      String types = "art_gallery|museum|place_of_worship"; 
      double radius = 1000;  // 1000 meters 
      // get nearest places 
      nearPlaces = googlePlaces.search(lat1, lon1, radius, types); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    /** 
    * Always use runOnUiThread(new Runnable()) to update UI from background 
    * thread, otherwise you will get error 
    * **/ 
    protected void onPostExecute(String file_url) { 

     // updating UI from Background Thread 
     runOnUiThread(new Runnable() { 
      public void run() { 
       /** 
       * Updating parsed Places into LISTVIEW 
       * */ 
       // Get json response status 
       String status = nearPlaces.status; 

       // Check for all possible status 
       if(status.equals("OK")){ 
        // Successfully got places details 
        if (nearPlaces.results != null) { 
         // loop through each place 
         ArrayList<String> coordinates = new ArrayList<String>(); 
         ArrayList<Double> bearings = new ArrayList<Double>(); 

         for (NearbyPlaceNodes p : nearPlaces.results) { 
          HashMap<String, String> map = new HashMap<String, String>(); 

          // NearbyPlaceNodes reference is used to get "place full details" 
          map.put(KEY_REFERENCE, p.reference); 
          map.put(KEY_NAME, p.name);   // NearbyPlaceNodes name 

          double lat2 = p.geometry.location.lat; 
          double lon2 = p.geometry.location.lng; 

          double _bearing = bearing(lat1, lon1, lat2, lon2); 
          bearings.add(_bearing); 

          String lat = Double.toString(lat2); 
          String lon = Double.toString(lon2); 
          String latlon = lat+","+lon; 

          coordinates.add(latlon); 
          String bearing_ = String.format("%.04f",_bearing); 

          String nearbyDat = latlon+","+bearing_+","+p.name; 
          nearbyData.add(nearbyDat); 

          placesListItems.add(map);  // adding HashMap to ArrayList 
         } 

         MainActivity.this.onBackgroundTaskDataObtained(nearbyData); 
        } 
       } 

线#485 =>String status = nearPlaces.status;

线#479 =>runOnUiThread(new Runnable() {

线#446 =>class LoadPlaces extends AsyncTask<String, String, String> {

回答

1

好像对你search方法中间的网络故障将触发这里将要捕获的异常:

catch (HttpResponseException e) { 
     Log.e("Error:", e.getMessage()); 
     return null; 
    } 

你返回null,将被分配到nearPlacesdoInBackground方法:

nearPlaces = googlePlaces.search(lat1, lon1, radius, types); 

所以在onPostExecute方法中,变量nearPlaces为空和你想ACCE ss在空变量上的字段:

String status = nearPlaces.status; 

导致您在日志中看到的崩溃。简单而快速的解决方案是在对onPostExecute执行任何操作之前检查nearPlaces是否为空,并且可能会显示错误消息。

顺便说一句,在onPostExecute这样做是多余的:

runOnUiThread(new Runnable() { 
public void run() { ... } 
}) 

onPreExecuteonPostExecute总是被默认调用在UI线程上,这是对的AsyncTask存在的主要原因。

+0

谢谢你,你解释得很好(y) – Aqarain

相关问题