2012-08-14 12 views
20

Estoy usando la API de Google Place y quiero buscar el restaurante y la cafetería más cercanos pero cuando obtengo esos datos usando la barra de progreso se produce un errorLa actividad tiene una ventana filtrada [email protected] que se agregó originalmente aquí

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

    /** 
    * Before starting background thread Show Progress Dialog 
    * */ 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(MainActivity.this); 
     pDialog.setMessage(Html.fromHtml("<b>Search</b><br/>Loading Places...")); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 

    /** 
    * getting Places JSON 
    * */ 
    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 
      // Check list of types supported by google 
      // 
      String types = "cafe|restaurant"; // Listing places only cafes, restaurants 

      // Radius in meters - increase this value if you don't find any places 
      double radius = 1000; // 1000 meters 

      // get nearest places 
      nearPlaces = googlePlaces.search(gps.getLatitude(), 
        gps.getLongitude(), radius, types); 


     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

protected void onPostExecute(String file_url) { 
     // dismiss the dialog after getting all products 
     if(pDialog != null) 
      pDialog.dismiss(); 
     // 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 
         for (Place p : nearPlaces.results) { 
          HashMap<String, String> map = new HashMap<String, String>(); 

          // Place reference won't display in listview - it will be hidden 
          // Place reference is used to get "place full details" 
          map.put(KEY_REFERENCE, p.reference); 

          // Place name 
          map.put(KEY_NAME, p.name); 


          // adding HashMap to ArrayList 
          placesListItems.add(map); 
         } 
         // list adapter 
         ListAdapter adapter = new SimpleAdapter(MainActivity.this, placesListItems, 
           R.layout.list_item, 
           new String[] { KEY_REFERENCE, KEY_NAME}, new int[] { 
             R.id.reference, R.id.name }); 

         // Adding data into listview 
         lv.setAdapter(adapter); 
        } 
       } 
       else if(status.equals("ZERO_RESULTS")){ 
        // Zero results found 
        alert.showAlertDialog(MainActivity.this, "Near Places", 
          "Sorry no places found. Try to change the types of places", 
          false); 
       } 
       else if(status.equals("UNKNOWN_ERROR")) 
       { 
        alert.showAlertDialog(MainActivity.this, "Places Error", 
          "Sorry unknown error occured.", 
          false); 
       } 
       else if(status.equals("OVER_QUERY_LIMIT")) 
       { 
        alert.showAlertDialog(MainActivity.this, "Places Error", 
          "Sorry query limit to google places is reached", 
          false); 
       } 
       else if(status.equals("REQUEST_DENIED")) 
       { 
        alert.showAlertDialog(MainActivity.this, "Places Error", 
          "Sorry error occured. Request is denied", 
          false); 
       } 
       else if(status.equals("INVALID_REQUEST")) 
       { 
        alert.showAlertDialog(MainActivity.this, "Places Error", 
          "Sorry error occured. Invalid Request", 
          false); 
       } 
       else 
       { 
        alert.showAlertDialog(MainActivity.this, "Places Error", 
          "Sorry error occured.", 
          false); 
       } 
      } 
     }); 

    } 

y el método de búsqueda para la clase GooglePlaces es

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; 
    } 

} 

y he utilizado el permiso como

pero estoy consiguiendo error en Logcat es

08-14 22:29:59.867: E/AndroidRuntime(331): FATAL EXCEPTION: AsyncTask #1 
08-14 22:29:59.867: E/AndroidRuntime(331): java.lang.RuntimeException: An error occured while executing doInBackground() 
08-14 22:29:59.867: E/AndroidRuntime(331): at android.os.AsyncTask$3.done(AsyncTask.java:200) 
08-14 22:29:59.867: E/AndroidRuntime(331): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
08-14 22:29:59.867: E/AndroidRuntime(331): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
08-14 22:29:59.867: E/AndroidRuntime(331): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
08-14 22:29:59.867: E/AndroidRuntime(331): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
08-14 22:29:59.867: E/AndroidRuntime(331): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
08-14 22:29:59.867: E/AndroidRuntime(331): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
08-14 22:29:59.867: E/AndroidRuntime(331): at java.lang.Thread.run(Thread.java:1096) 
08-14 22:29:59.867: E/AndroidRuntime(331): Caused by: java.lang.NoClassDefFoundError: com.google.common.base.Preconditions 
08-14 22:29:59.867: E/AndroidRuntime(331): at com.google.api.client.util.ClassInfo.<init>(ClassInfo.java:164) 
08-14 22:29:59.867: E/AndroidRuntime(331): at com.google.api.client.util.ClassInfo.of(ClassInfo.java:92) 
08-14 22:29:59.867: E/AndroidRuntime(331): at com.google.api.client.util.GenericData.<init>(GenericData.java:79) 
08-14 22:29:59.867: E/AndroidRuntime(331): at com.google.api.client.util.GenericData.<init>(GenericData.java:61) 
08-14 22:29:59.867: E/AndroidRuntime(331): at com.google.api.client.http.GenericUrl.<init>(GenericUrl.java:97) 
08-14 22:29:59.867: E/AndroidRuntime(331): at com.eheuristic.android.googlemap.GooglePlaces.search(GooglePlaces.java:56) 
08-14 22:29:59.867: E/AndroidRuntime(331): at com.eheuristic.android.googlemap.MainActivity$LoadPlaces.doInBackground(MainActivity.java:1 85) 
08-14 22:29:59.867: E/AndroidRuntime(331): at com.eheuristic.android.googlemap.MainActivity$LoadPlaces.doInBackground(MainActivity.java:1) 
08-14 22:29:59.867: E/AndroidRuntime(331): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
08-14 22:29:59.867: E/AndroidRuntime(331): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
08-14 22:29:59.867: E/AndroidRuntime(331): ... 4 more 
08-14 22:29:59.967: W/IInputConnectionWrapper(331): showStatusIcon on inactive InputConnection 
08-14 22:30:02.298: E/WindowManager(331): Activity com.eheuristic.android.googlemap.MainActivity has leaked window [email protected] that was originally added here 
08-14 22:30:02.298: E/WindowManager(331): android.view.WindowLeaked: Activity com.eheuristic.android.googlemap.MainActivity has leaked window [email protected] that was originally added here 
08-14 22:30:02.298: E/WindowManager(331): at android.view.ViewRoot.<init>(ViewRoot.java:247) 
08-14 22:30:02.298: E/WindowManager(331): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
08-14 22:30:02.298: E/WindowManager(331): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
08-14 22:30:02.298: E/WindowManager(331): at android.view.Window$LocalWindowManager.addView(Window.java:424) 
08-14 22:30:02.298: E/WindowManager(331): at android.app.Dialog.show(Dialog.java:241) 
08-14 22:30:02.298: E/WindowManager(331): at com.eheuristic.android.googlemap.MainActivity$LoadPlaces.onPreExecute(MainActivity.java:164) 
08-14 22:30:02.298: E/WindowManager(331): at android.os.AsyncTask.execute(AsyncTask.java:391) 
08-14 22:30:02.298: E/WindowManager(331): at com.eheuristic.android.googlemap.MainActivity.onCreate(MainActivity.java:104) 
08-14 22:30:02.298: E/WindowManager(331): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
08-14 22:30:02.298: E/WindowManager(331): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
08-14 22:30:02.298: E/WindowManager(331): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
08-14 22:30:02.298: E/WindowManager(331): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
08-14 22:30:02.298: E/WindowManager(331): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
08-14 22:30:02.298: E/WindowManager(331): at android.os.Handler.dispatchMessage(Handler.java:99) 
08-14 22:30:02.298: E/WindowManager(331): at android.os.Looper.loop(Looper.java:123) 
08-14 22:30:02.298: E/WindowManager(331): at android.app.ActivityThread.main(ActivityThread.java:4627) 
08-14 22:30:02.298: E/WindowManager(331): at java.lang.reflect.Method.invokeNative(Native Method) 
08-14 22:30:02.298: E/WindowManager(331): at java.lang.reflect.Method.invoke(Method.java:521) 
08-14 22:30:02.298: E/WindowManager(331): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
08-14 22:30:02.298: E/WindowManager(331): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
08-14 22:30:02.298: E/WindowManager(331): at dalvik.system.NativeStart.main(Native Method) 
+0

Veo estos errores ocasionalmente en logcat y los ignoro. No digo que debas, pero ... –

+0

Sí, debes anular el método PostExecute() y debes cerrar el diálogo ... – NullPointerException

Respuesta

48

Usted esta filtrando el diálogo. Debe llamar al pDialog.dismiss(); en el método onPostExecute() de la tarea asíncrona. También debe poner ...

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

en su método onPause() de la actividad en el hilo principal. Esto asegurará que la ventana no se haya filtrado, incluso si su aplicación pierde el primer plano mientras realiza una ejecución en segundo plano. Usted debe tener algo como esto ...

public class Login extends Activity implements View.OnClickListener{ 

    ProgressDialog pd; 

    public void onCreate(Bundle savedInstanceState){ 

     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); 
     setContentView(R.layout.login); 
     pd = null; 
    } 

    @Override 
    public void onPause(){ 

     super.onPause(); 
     if(pd != null) 
      pd.dismiss(); 
    } 

    public void onClick(View v){ 
     new SendTask().execute(""); 
    } 

    /* 
    No networking allowed on the main thread. 
    */ 
    private class SendTask extends AsyncTask<String,String,String>{ 

     int result; 

     @Override 
     protected void onPreExecute(){ 
      pd = ProgressDialog.show(Login.this,"","Retrieving Inbox...", true,false); 
     } 

     @Override 
     protected String doInBackground(String...strings){ 

      //do networking here 
      result = account.prepare(); 
      return null; 
     } 

     @Override 
     protected void onPostExecute(String unused){ 

      //check result 
      pd.dismiss(); 
      Intent intent = new Intent(Login.this,NextActivity.class); 
      finish(); 
      startActivity(intent); 
     } 
    } 
} 
+0

gracias por darme respuesta, he puesto este código pero el error aún existe. !! –

+0

ver edición ... debería verse algo así ... eso siempre me ha funcionado. – Joel

+1

no lo sé, pero gracias por ayudarme :) como ustedes, todas nuestras vidas se vuelven más simples :) –

3

Usted está tratando de mostrar una ventana de diálogo después de que son la salida de la pantalla.

2

Uso esto en onStop --->

@Override 
    protected void onStop() { 

     super.onStop(); 

     if (pDialog != null) { 
      pDialog.dismiss(); 
      pDialog = null; 
     } 

    } 
0

Sólo tiene que llamar AsyncTask en función IsNetworkAvailable() ... como ...

if(isNetworkAvailable()) { 
     AsyncTask_WebAPI asyncTask = new AsyncTask_WebAPI(this, strURL, this); 
     asyncTask.execute(); 
    }else 
    { 
Toast.makeText(this,"Please Check internet Connectivity",Toast.LENGTH_LONG).show(); 
    } 

IsNetworkAvailable() Función

private boolean isNetworkAvailable() { 
    ConnectivityManager connectivityManager 
      = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 
    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo(); 
    return activeNetworkInfo != null && activeNetworkInfo.isConnected(); 
} 
0

Tienes que cerrar el cuadro de diálogo antes de que la actividad se destruya

@Override 
protected void onDestroy() { 
    super.onDestroy(); 
    if(pDialog!=null && pDialog.isShowing()) 
     pDialog.dismiss(); 
} 
Cuestiones relacionadas