2013-04-22 34 views
0

我使用異步任務和搜索我的GPS位置(使用網絡提供者),我在locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);如何使用異步任務獲取位置?安卓

public class SimpleDirect extends MapActivity { 
MapView mapView; 

private ProgressDialog pDialog; 
private LocationManager locManager; 
private LocationListener locListener; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.simple_direct_main); 
    mapView = (MapView)findViewById(R.id.mapView); 
    initMap(); 
    new Activity().execute(); 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == 100) { 
     Intent intent = getIntent(); 
     finish(); 
     startActivity(intent); 
    } 

} 
class Activity extends AsyncTask<String, String, String> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
     pDialog = new ProgressDialog(SimpleDirect.this); 
     pDialog.setMessage("Mohon tunggu..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(false); 
     pDialog.show(); 
    } 
    protected String doInBackground(String... args) { 
     initLocationManager(); 
     return null; 
    } 

    protected void onPostExecute(String file_url) { 
     pDialog.dismiss(); 
    } 
} 

    private void initLocationManager(){ 
     locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
     locListener = new LocationListener() { 
      public void onLocationChanged(Location newLocation) { 
       tampilkanPosisikemap(newLocation); 
      } 
      public void onProviderDisabled(String arg0) { 
      } 

      public void onProviderEnabled(String arg0){ 
      } 

      public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 
      } 
     }; 
     locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener); 
    } 

    protected void tampilkanPosisikemap(Location newLocation) { 
     List overlays = mapView.getOverlays(); 

     if(overlays.size() > 0) { 
      for(Iterator iterator = overlays.iterator(); iterator.hasNext();) { 
       iterator.next(); 
       iterator.remove(); 
      } 
     } 
       GeoPoint geopoint = new GeoPoint(
         (int) (newLocation.getLatitude() * 1E6), (int) (newLocation 
           .getLongitude() * 1E6)); 

       Drawable icon = getResources().getDrawable(R.drawable.marker); 
       icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon 
         .getIntrinsicHeight()); 
       MyItemizedOverlay overlay = new MyItemizedOverlay(icon); 
       OverlayItem item = new OverlayItem(geopoint, "My Location", null); 
       overlay.addItem(item); 
       mapView.getOverlays().add(overlay); 
       mapView.getController().animateTo(geopoint); 
       mapView.postInvalidate(); 
    } 

private void initMap() { 
    mapView = (MapView) findViewById(R.id.mapView); 
    mapView.setBuiltInZoomControls(true); 
    mapView.getController().setZoom(15); 
} 
@Override 
protected boolean isRouteDisplayed(){ 
    return false; 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    getMenuInflater().inflate(R.menu.simple_direct_main, menu); 
    return true; 
} 
} 

我的logcat得到一個錯誤:

04-22 20:48:26.763: E/AndroidRuntime(15676): FATAL EXCEPTION: AsyncTask #1 
04-22 20:48:26.763: E/AndroidRuntime(15676): java.lang.RuntimeException: An error occured while executing doInBackground() 
04-22 20:48:26.763: E/AndroidRuntime(15676): at android.os.AsyncTask$3.done(AsyncTask.java:200) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at java.lang.Thread.run(Thread.java:1096) 
04-22 20:48:26.763: E/AndroidRuntime(15676): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
04-22 20:48:26.763: E/AndroidRuntime(15676): at android.os.Handler.<init>(Handler.java:121) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at android.location.LocationManager$ListenerTransport$1.<init>(LocationManager.java:139) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at android.location.LocationManager$ListenerTransport.<init>(LocationManager.java:137) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at android.location.LocationManager._requestLocationUpdates(LocationManager.java:708) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at android.location.LocationManager.requestLocationUpdates(LocationManager.java:630) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at com.example.simpledirection.SimpleDirect.initLocationManager(SimpleDirect.java:128) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at com.example.simpledirection.SimpleDirect.access$2(SimpleDirect.java:107) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at com.example.simpledirection.SimpleDirect$Activity.doInBackground(SimpleDirect.java:93) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at com.example.simpledirection.SimpleDirect$Activity.doInBackground(SimpleDirect.java:1) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at android.os.AsyncTask$2.call(AsyncTask.java:185) 
04-22 20:48:26.763: E/AndroidRuntime(15676): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
04-22 20:48:26.763: E/AndroidRuntime(15676): ... 4 more 
04-22 20:48:26.813: E/MapActivity(15676): Couldn't get connection factory client 
04-22 20:48:27.623: E/WindowManager(15676): Activity com.example.simpledirection.SimpleDirect has leaked window [email protected] that was originally added here 
04-22 20:48:27.623: E/WindowManager(15676): android.view.WindowLeaked: Activity com.example.simpledirection.SimpleDirect has leaked window [email protected] that was originally added here 
04-22 20:48:27.623: E/WindowManager(15676):  at android.view.ViewRoot.<init>(ViewRoot.java:247) 
04-22 20:48:27.623: E/WindowManager(15676):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148) 
04-22 20:48:27.623: E/WindowManager(15676):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91) 
04-22 20:48:27.623: E/WindowManager(15676):  at android.view.Window$LocalWindowManager.addView(Window.java:424) 
04-22 20:48:27.623: E/WindowManager(15676):  at android.app.Dialog.show(Dialog.java:241) 
04-22 20:48:27.623: E/WindowManager(15676):  at com.example.simpledirection.SimpleDirect$Activity.onPreExecute(SimpleDirect.java:88) 
04-22 20:48:27.623: E/WindowManager(15676):  at android.os.AsyncTask.execute(AsyncTask.java:391) 
04-22 20:48:27.623: E/WindowManager(15676):  at com.example.simpledirection.SimpleDirect.onCreate(SimpleDirect.java:59) 
04-22 20:48:27.623: E/WindowManager(15676):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
04-22 20:48:27.623: E/WindowManager(15676):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2633) 
04-22 20:48:27.623: E/WindowManager(15676):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2685) 
04-22 20:48:27.623: E/WindowManager(15676):  at android.app.ActivityThread.access$2300(ActivityThread.java:126) 
04-22 20:48:27.623: E/WindowManager(15676):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2038) 
04-22 20:48:27.623: E/WindowManager(15676):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-22 20:48:27.623: E/WindowManager(15676):  at android.os.Looper.loop(Looper.java:123) 
04-22 20:48:27.623: E/WindowManager(15676):  at android.app.ActivityThread.main(ActivityThread.java:4633) 
04-22 20:48:27.623: E/WindowManager(15676):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-22 20:48:27.623: E/WindowManager(15676):  at java.lang.reflect.Method.invoke(Method.java:521) 
04-22 20:48:27.623: E/WindowManager(15676):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:858) 
04-22 20:48:27.623: E/WindowManager(15676):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
04-22 20:48:27.623: E/WindowManager(15676):  at dalvik.system.NativeStart.main(Native Method) 
+1

你似乎在後臺線程在做UI的東西。你應該閱讀更多關於UI和線程的內容。此外,確實需要logcat才能找出錯誤。 – 2013-04-22 13:44:01

+1

您是否嘗試過使用處理程序@ onLocationChanged? – 2013-04-22 13:48:48

+0

我剛剛添加了mmy logcat .. – Bas 2013-04-22 13:53:10

回答

0

答案就在那裏,大衛·奧爾森已經提到它。你在doInBackground中做mapView.postInvalidate();。 doInBackground不允許UI工作。對於UI工作,您需要使用onPre或onPost。

例外說只是

引起:了java.lang.RuntimeException:無法內螺紋創建處理程序尚未調用Looper.prepare()

+0

好吧,我明白了。但我可以顯示我的進度條,而我打電話給initLocationManager()?我試圖把前和後,沒有diference .. – Bas 2013-04-22 14:15:24

+0

請嘗試提出一個新的問題。我唯一的問題是,我的答案是否應該得到讚揚和評價? – Siddharth 2013-04-22 15:11:06

0

你不應該在AsyncTask之內調用locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locListener);,而應該在單獨的線程上調用public void onLocationChanged(Location newLocation) {中的代碼。

requestLocationUpdates是異步非阻塞調用,不需要添加線程。您的AsyncTask立即結束。

除此之外,我建議不要有這樣的代碼結構。請注意,每次找到某個位置時,都會啓動一個AsyncTask。如果你旋轉設備或完成這個Activity,你將最終同時開始多個內存泄漏。

+0

我應該更改我的代碼以防止內存泄漏?你能給我一些建議嗎? – Bas 2013-04-25 19:04:40

0

此代碼對我的作品 可以在異步獲取位置

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maps); 
     mw = new Mywidgets(getApplicationContext()); 
     progressDialog = new ProgressDialog(MapsActivity.this); 

     try 
     { 
      progressDialog.setMessage("Loading Please wait"); 
      Load_task load_task = new Load_task(); 
      load_task.execute(); 

     }catch (Exception e){ 
      mw.app_log(e.getMessage()); 
     } 



    } 

public class Load_task extends AsyncTask<Void,Void,Void>{ 

     @Override 
     protected Void doInBackground(Void... voids) { 
      Bundle bun = getIntent().getExtras(); 
      final String location = bun.getString("location"); 
      location_arr = location.split(","); 

      Geocoder gc = new Geocoder(getApplicationContext()); 
      List<Address> addresses = new LinkedList<>(); 
      int c = 0; 
      for (String loc : location_arr) { 
       // mw.app_log(loc); 
       List<Address> each_addr = null; 
       try { 
        each_addr = gc.getFromLocationName(loc, 1); 

       } catch (IOException e) { 
        mw.app_log("cant get location"); 
        e.printStackTrace(); 
       } 
       addresses.add(each_addr.get(0)); 
      } 

      lat_long = new ArrayList<LatLng>(addresses.size()); // A list to save the coordinates if they are available 
      for (Address a : addresses) { 
       if (a.hasLatitude() && a.hasLongitude()) { 
        lat_long.add(new LatLng(a.getLatitude(), a.getLongitude())); 
        mw.app_log("added "+lat_long.toString()); 
       }else{ 
        mw.app_log("not added"); 
       } 
      } 


      return null; 
     } 

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

     @Override 
     protected void onPostExecute(Void aVoid) { 
      progressDialog.hide(); 
      mw.app_log(lat_long.toString()); 
      set_map(); 

      super.onPostExecute(aVoid); 
     } 
    } 


public void set_map(){ 

// Obtain the SupportMapFragment and get notified when the map is ready to be used. 
     SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 

} 

    @Override 
    public void onMapReady(GoogleMap googleMap) { 
     mMap = googleMap; 
     if (Geocoder.isPresent()) { 

      try { 
       progressDialog.hide(); 


       //addresses.remove(0); 


       // Add a marker in Sydney and move the camera 
       int n = 0; 
       for (LatLng lat : lat_long) { 

        MarkerOptions marker = new MarkerOptions().position(lat).title(location_arr[n++]); 

        marker.icon(BitmapDescriptorFactory.fromResource(R.mipmap.eauction_car_icon_map)).position(lat).snippet(location_arr[n - 1]); 
        mMap.addMarker(marker); 
       } 

       mMap.moveCamera(CameraUpdateFactory.newLatLng(lat_long.get(2))); 
       ; 
       mMap.animateCamera(CameraUpdateFactory.newLatLngZoom(lat_long.get(0), 12.0f)); 
       mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener() { 
        @Override 
        public boolean onMarkerClick(Marker marker) { 
         Intent prop_intent = new Intent(getApplicationContext(), Property_view.class); 
         int pos = Integer.parseInt(marker.getId().substring(1)); 
         //prop_intent.putExtra("location",location[pos]); 

         mw.toast(location_arr[pos]); 
         // startActivity(prop_intent); 

         return false; 
        } 
       }); 
       //mMap.setOnCameraIdleListener(mClusterManager); 

      } catch (Exception e) { 
       Log.d("json_obj", e.getMessage()); 
      } 
     } 

    }