2013-07-08 46 views
0

我想要做的是使用異步任務來顯示進度對話框,而我的應用程序搜索他們的位置。在找到它們的位置後,它應該顯示一個帶有一些信息的警告對話框。但我不是100%確定如何做到這一點。這就是我在LocationChanged.java:進度對話框與異步任務問題

@Override 
protected Void doInBackground(Void... params) { 
    final LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); 
    geocoder = new Geocoder(context, Locale.getDefault()); 
    final LocationListener locationListener = new LocationListener() { 
     public void onLocationChanged(Location location) { 
      // Called when a new location is found by the network location provider. 
      lat =location.getLatitude(); 
      lon = location.getLongitude(); 
      //TextView tv = (TextView) findViewById(R.id.tv3); 
      try{ 
       addresses=(geocoder.getFromLocation(lat, lon, 1)); 
       if (addresses.size() > 0) { 
        // String address = addresses.get(0).getAddressLine(0); 
        String city = addresses.get(0).getAddressLine(1); 
        String id = city.substring(0,city.length()-5); 
        String state1=String.valueOf(id.charAt(id.length()-3)); 
        String state2=String.valueOf(id.charAt(id.length()-2)); 
        STATE = state1+state2; 
        //String country = addresses.get(0).getAddressLine(2); 
        //tv.setText(STATE); 
        progressDialog.dismiss(); 
        locationManager.removeUpdates(this); 
       } 
       else { 
        //tv.setText("Oops..."); 
       } 

      }catch(IOException e){ 
       e.printStackTrace(); 
      } 

     } 

,這是logcat的當它運行:

07-08 17:26:21.456: ERROR/AndroidRuntime(2755): FATAL EXCEPTION: AsyncTask #1 
    java.lang.RuntimeException: An error occured while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:299) 
    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
    at java.lang.Thread.run(Thread.java:864) 
    Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
    at android.os.Handler.<init>(Handler.java:121) 
    at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:209) 
    at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:209) 
    at android.location.LocationManager._requestLocationUpdates(LocationManager.java:687) 
    at android.location.LocationManager.requestLocationUpdates(LocationManager.java:512) 
    at com.nick.whatsthetip.LocationChanged.doInBackground(LocationChanged.java:121) 
    at com.nick.whatsthetip.LocationChanged.doInBackground(LocationChanged.java:24) 
    at android.os.AsyncTask$2.call(AsyncTask.java:287) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
    ... 5 more 
07-08 17:26:21.716: ERROR/EmbeddedLogger(696): App crashed! Process: com.nick.whatsthetip 
07-08 17:26:21.716: ERROR/EmbeddedLogger(696): App crashed! Package: com.nick.whatsthetip v5 (1.1.0) 
07-08 17:26:21.987: ERROR/WindowManager(2755): Activity com.nick.whatsthetip.Settings has leaked window [email protected] that was originally added here 
    android.view.WindowLeaked: Activity com.nick.whatsthetip.Settings has leaked window [email protected] that was originally added here 
    at android.view.ViewRootImpl.<init>(ViewRootImpl.java:468) 
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:419) 
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:351) 
    at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:171) 
    at android.view.Window$LocalWindowManager.addView(Window.java:558) 
    at android.app.Dialog.show(Dialog.java:282) 
    at android.app.ProgressDialog.show(ProgressDialog.java:116) 
    at android.app.ProgressDialog.show(ProgressDialog.java:99) 
    at android.app.ProgressDialog.show(ProgressDialog.java:94) 
    at com.nick.whatsthetip.LocationChanged.onPreExecute(LocationChanged.java:49) 
    at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586) 
    at android.os.AsyncTask.execute(AsyncTask.java:534) 
    at com.nick.whatsthetip.Settings$3.onClick(Settings.java:119) 
    at android.view.View.performClick(View.java:4102) 

回答

2

你,你應該知道,是在「工人執行的的AsyncTask的doInBackground方法「線程,只有onProgressUpdate和onPostExecute是通過主線程執行的,因此,試圖修改doInBackground中與UI相關的任何東西(比如進度對話框......)都會導致異常,你必須確保任何代碼正在從主線程調用UI,而不是從Worker Thread調用...

Regards

+0

好吧,是不是可以從該類更新ui元素,是否必須從原始類的哪裏調用包含異步任務的類來完成? – ez4nick

+0

是不是它自己的類,是doInBackground方法,該方法是爲了不阻止主線程,換句話說是一個工作線程,所以你可以使用OnyncTask的onPostExecuted方法來關閉對話框,無論你在doInBackground中做什麼已完成... –

1

本次培訓課程:Displaying a Location Address向您展示瞭如何運行AsyncTask來反轉位置的地理編碼。

沒有必要在後臺響應位置更新。我建議你將onLocationChanged從doInBackground中取出,並將其作爲UI線程中的一個方法添加。它是異步的,所以它不會導致ANR。當你得到一個位置時,然後執行發現城市,州等的後臺任務。培訓課程將告訴你如何建立一個進度指示器,而無需使用對話框。

+0

好吧不行繼續使用該示例。這比我原先想象的要難得多。謝謝 – ez4nick