2013-08-26 3 views
2

파일에서 좌표를로드하고 비동기 작업에서 내지도에 도형을 추가하고 싶습니다. 그러나 나는 오류를 겪고 있으며 왜 나는 모릅니다. 여기 내 코드입니다 :Google지도에 항목을 추가하는 중에 Android AsyncTask 오류가 발생했습니다.

private class shpLoading extends AsyncTask<GoogleMap, Void, String> { 
      ProgressDialog dialog; 

      @Override 
      protected String doInBackground(GoogleMap... params) {     
       ShpReader shpRead = new ShpReader(); 
       GoogleMap map = params[0]; 
       try { 
        shpRead.reading(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (InvalidShapeFileException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       for(LatLng a : shpRead.points()) 
        map.addMarker(new MarkerOptions() 
        .position(a) 
        .draggable(false)); 

       int i = 0; 
       for(List<LatLng> a: shpRead.lines()){ 
        map.addPolyline(new PolylineOptions() 
        .addAll(a) 
        .width(3) 
        .color(Color.RED)); 

       } 

       for(List<LatLng> a: shpRead.polygons()){ 
        map.addPolygon(new PolygonOptions() 
        .addAll(a) 
        .strokeWidth(3) 
        .strokeColor(Color.RED) 
        .fillColor(0x3F00FF00)); 

       } 
       return "Done"; 
      } 
       @Override 
      protected void onPreExecute() { 
        dialog = new ProgressDialog(Measuring.this);   
        dialog.setMessage("Kraunama..."); 
        dialog.setIndeterminate(true); 
        dialog.setCancelable(false); 
        dialog.show(); 
      } 

      @Override 
      protected void onProgressUpdate(Void... values) { 
      } 

      @Override 
      protected void onPostExecute(String result) {    
       dialog.dismiss(); 
      }      
    } 

그리고 이것은 내가 코드를 실행하는 방법입니다

shpLoading load = new shpLoading(); 
load.execute(mMap); 

MMAP

이 GoogleMap으로 변수입니다. 모든 doInBackground 코드를 onPostExecute 메소드에 추가하고 변수 map을 전역 변수 mMap으로 변경하면 eveything이 작동하지만 백그라운드에서이 작업을 수행하고 동시에 로딩 대화 상자를 표시하려고합니다. 여기

내 로그 캣입니다 :

08-26 11:10:52.368: E/AndroidRuntime(11099): FATAL EXCEPTION: 
AsyncTask #1 
08-26 11:10:52.368: E/AndroidRuntime(11099): 
java.lang.RuntimeException: An error occured while executing 
doInBackground() 
08-26 11:10:52.368: E/AndroidRuntime(11099): at 
android.os.AsyncTask$3.done(AsyncTask.java:299) 08-26 11:10:52.368: 
E/AndroidRuntime(11099): at 
java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
08-26 11:10:52.368: E/AndroidRuntime(11099): at 
java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
08-26 11:10:52.368: E/AndroidRuntime(11099): at 
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
08-26 11:10:52.368: E/AndroidRuntime(11099): at 
java.util.concurrent.FutureTask.run(FutureTask.java:137) 08-26 
11:10:52.368: E/AndroidRuntime(11099):  at 
android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 08-26 
11:10:52.368: E/AndroidRuntime(11099):  at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
08-26 11:10:52.368: E/AndroidRuntime(11099): at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
08-26 11:10:52.368: E/AndroidRuntime(11099): at 
java.lang.Thread.run(Thread.java:856) 08-26 11:10:52.368: 
E/AndroidRuntime(11099): Caused by: java.lang.IllegalStateException: 
Not on the main thread 08-26 11:10:52.368: E/AndroidRuntime(11099): 
    at maps.ar.p.b(Unknown Source) 08-26 11:10:52.368: 
E/AndroidRuntime(11099): at maps.al.g.b(Unknown Source) 08-26 
11:10:52.368: E/AndroidRuntime(11099):  at maps.ag.an.a(Unknown 
Source) 08-26 11:10:52.368: E/AndroidRuntime(11099): at 
bkw.onTransact(SourceFile:137) 08-26 11:10:52.368: 
E/AndroidRuntime(11099): at 
android.os.Binder.transact(Binder.java:326) 08-26 11:10:52.368: 
E/AndroidRuntime(11099): at 
com.google.android.gms.maps.internal.IGoogleMapDelegate$a$a.addPolyline(Unknown 
Source) 08-26 11:10:52.368: E/AndroidRuntime(11099): at 
com.google.android.gms.maps.GoogleMap.addPolyline(Unknown Source) 
08-26 11:10:52.368: E/AndroidRuntime(11099): at 
com.es.map.Measuring$shpLoading.doInBackground(Measuring.java:1165) 
08-26 11:10:52.368: E/AndroidRuntime(11099): at 
com.es.map.Measuring$shpLoading.doInBackground(Measuring.java:1) 08-26 
11:10:52.368: E/AndroidRuntime(11099):  at 
android.os.AsyncTask$2.call(AsyncTask.java:287) 08-26 11:10:52.368: 
E/AndroidRuntime(11099): at 
java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
08-26 11:10:52.368: E/AndroidRuntime(11099): ... 5 more 08-26 
11:11:00.453: E/WindowManager(11099): Activity com.es.map.Measuring 
has leaked window 
[email protected] that 
was originally added here 08-26 11:11:00.453: E/WindowManager(11099): 
android.view.WindowLeaked: Activity com.es.map.Measuring has leaked 
window [email protected] 
that was originally added here 08-26 11:11:00.453: 
E/WindowManager(11099): at 
android.view.ViewRootImpl.<init(ViewRootImpl.java:403) 08-26 
11:11:00.453: E/WindowManager(11099): at 
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:311) 
08-26 11:11:00.453: E/WindowManager(11099): at 
android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224) 
08-26 11:11:00.453: E/WindowManager(11099): at 
android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149) 
08-26 11:11:00.453: E/WindowManager(11099): at 
android.view.Window$LocalWindowManager.addView(Window.java:554) 08-26 
11:11:00.453: E/WindowManager(11099): at 
android.app.Dialog.show(Dialog.java:277) 08-26 11:11:00.453: 
E/WindowManager(11099): at 
com.es.map.Measuring$shpLoading.onPreExecute(Measuring.java:1195) 
08-26 11:11:00.453: E/WindowManager(11099): at 
android.os.AsyncTask.executeOnExecutor(AsyncTask.java:586) 08-26 
11:11:00.453: E/WindowManager(11099): at 
android.os.AsyncTask.execute(AsyncTask.java:534) 08-26 11:11:00.453: 
E/WindowManager(11099): at 
com.es.map.Measuring.onOptionsItemSelected(Measuring.java:566) 08-26 
11:11:00.453: E/WindowManager(11099): at 
android.app.Activity.onMenuItemSelected(Activity.java:2629) 08-26 
11:11:00.453: E/WindowManager(11099): at 
android.support.v4.app.FragmentActivity.onMenuItemSelected(FragmentActivity.java:366) 
08-26 11:11:00.453: E/WindowManager(11099): at 
com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java) 
08-26 11:11:00.453: E/WindowManager(11099): at 
com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:735) 
08-26 11:11:00.453: E/WindowManager(11099): at 
com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:149) 
08-26 11:11:00.453: E/WindowManager(11099): at 
com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:874) 
08-26 11:11:00.453: E/WindowManager(11099): at 
com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:468) 
08-26 11:11:00.453: E/WindowManager(11099): at 
com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:126) 
08-26 11:11:00.453: E/WindowManager(11099): at 
android.view.View$PerformClick.run(View.java:17298) 08-26 
11:11:00.453: E/WindowManager(11099): at 
android.os.Handler.handleCallback(Handler.java:615) 08-26 
11:11:00.453: E/WindowManager(11099): at 
android.os.Handler.dispatchMessage(Handler.java:92) 08-26 
11:11:00.453: E/WindowManager(11099): at 
android.os.Looper.loop(Looper.java:137) 08-26 11:11:00.453: 
E/WindowManager(11099): at 
android.app.ActivityThread.main(ActivityThread.java:4921) 08-26 
11:11:00.453: E/WindowManager(11099): at 
java.lang.reflect.Method.invokeNative(Native Method) 08-26 
11:11:00.453: E/WindowManager(11099): at 
java.lang.reflect.Method.invoke(Method.java:511) 08-26 11:11:00.453: 
E/WindowManager(11099): at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
08-26 11:11:00.453: E/WindowManager(11099): at 
com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 08-26 
11:11:00.453: E/WindowManager(11099): at 
dalvik.system.NativeStart.main(Native Method) 

그리고 어쩌면 파일에서 좌표를로드와 맵에 추가 할 좋은 방법은 아니다? 아마 이것을 할 수있는 더 좋은 방법이 있을까요?

+0

당신이'ShpReader' 클래스를 보일 수 있는가? 또한 당신은'doInbackground'에서 ui를 업데이트 할 수 없습니다. – Raghunandan

+1

DoInBackGround 메소드에서 수행하지 않아야 할 일이있는 것 같습니다. 그래서 DoInBackground 메소드가 메인 쓰레드에서 실행되지 않기 때문에 우리는 "Not on the main thread"를 가지고 있습니다. 또한 "누수 된 창"은 컨텍스트를 변경하기 전에 열려 있거나 닫히지 않은 대화 상자 /보기로 활동을 마무리해야합니다. –

+0

'ShpReader'가 정상적으로 작동합니다. 그것은 내가 원하는대로 완벽하게 좌표를 반환합니다. 지도에 도형을 추가하는 중에 오류가 발생했습니다. 그래서, 어떻게 맵핑하기 위해 모든 도형을 추가하고 로딩 메시지를 동시에 표시해야합니까? 나는 AsyncTask가 완벽 할 것이라고 생각했다. – user2617937

답변

3

미안 배경 스레드에서 UI 구성 요소를 변경할 수 없으므로 UIThread에서지도 작업을 작성해야합니다.

기존의 코드 내에서 솔루션 같다 :

private Handler mHandler = new Handler(); 

    private class shpLoading extends AsyncTask<GoogleMap, Void, String> { 
     ProgressDialog dialog; 

     @Override 
     protected String doInBackground(GoogleMap... params) {     
       ShpReader shpRead = new ShpReader(); 
       GoogleMap map = params[0]; 
       try { 
        shpRead.reading(); 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (InvalidShapeFileException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       mHandler.post(new Runnable() { 
       public void run() { 
        for(LatLng a : shpRead.points()) 
         map.addMarker(new MarkerOptions() 
         .position(a) 
         .draggable(false)); 

        int i = 0; 
        for(List<LatLng> a: shpRead.lines()){ 
         map.addPolyline(new PolylineOptions() 
         .addAll(a) 
         .width(3) 
         .color(Color.RED)); 

        } 

        for(List<LatLng> a: shpRead.polygons()){ 
         map.addPolygon(new PolygonOptions() 
         .addAll(a) 
         .strokeWidth(3) 
         .strokeColor(Color.RED) 
         .fillColor(0x3F00FF00)); 

        } 
       } 
      }); 
       return "Done"; 
     } 
      @Override 
     protected void onPreExecute() { 
       dialog = new ProgressDialog(Measuring.this);   
       dialog.setMessage("Kraunama..."); 
       dialog.setIndeterminate(true); 
       dialog.setCancelable(false); 
       dialog.show(); 
     } 

     @Override 
     protected void onProgressUpdate(Void... values) { 
     } 

     @Override 
     protected void onPostExecute(String result) {    
       dialog.dismiss(); 
     }      
} 
+0

감사합니다. 완벽하게 작동합니다! Jus는'ShpRead'와'map' 변수에'final'을 추가해야했습니다. – user2617937

+0

좋아, 항상 도와 줘서 기쁘다. –

0

백그라운드에서 작업을 수행 할 수 없으면 map.add가 진행률 변경에서 발생해야합니다 ... 보고서 진행률을 호출하고 거기에지도 그리기를 수행하십시오.

+0

'onProgressUpdate'를 의미합니까? – user2617937

+0

예 http://developer.android.com/reference/android/os/AsyncTask.html을 읽고 진행 상황을보고하는 방법을 참조하십시오. –

관련 문제