2012-08-14 13 views
20

Sto usando google place api e voglio recuperare il ristorante e il bar più vicino, ma quando sto recuperando quei dati usando la barra di avanzamento un errore si verificaL'attività ha perso la finestra [email protected] che è stata originariamente aggiunta qui

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

    } 

e il metodo di ricerca per la classe GooglePlaces è

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

} 

e ho usato il permesso come

ma sto ottenendo errore nel logcat è

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

Vedo questi errori occasionalmente in logcat e li ignoro. Non sto dicendo che dovresti, ma ... –

+0

Sì, dovresti sovrascrivere il metodo onPostExecute() e devi chiudere la finestra di dialogo .... – NullPointerException

risposta

48

Si sono perdite la finestra di dialogo. È necessario chiamare pDialog.dismiss(); nel metodo onPostExecute() dell'attività asincrona. Si dovrebbe anche mettere ...

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

nel metodo di vostra onPause() dell'attività sul thread principale. Ciò assicurerà che la finestra non sia trapelata, anche se la tua applicazione perde il primo piano mentre si esegue un'esecuzione in background. Si dovrebbe avere qualcosa di simile ...

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

grazie per avermi risposto, ho inserito questo codice ma l'errore è ancora in uscita! !! –

+0

vedi modifica ... dovrebbe sembrare qualcosa del genere ... che ha sempre funzionato per me. – Joel

+1

non lo so, ma grazie per avermi aiutato :) come tutti voi la nostra vita diventa più semplice :) –

3

Si sta tentando di mostrare una finestra di dialogo dopo essere usciti dallo schermo.

2

Utilizzare questo in onStop --->

@Override 
    protected void onStop() { 

     super.onStop(); 

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

    } 
0

Basta chiamare AsyncTask in IsNetworkAvailable() funzione di ... come ...

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() Funzione

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

Devi chiudere la finestra di dialogo prima che l'attività venga distrutta

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