2012-06-18 5 views
0

안드로이드 SDK가있는 ArcGIS를 사용하는 샘플 HelloWorld 애플리케이션을 시험 중이다. 코드는 제대로 컴파일되지만 실행시에는 회색 화면이 나타납니다. 이 question을 살펴 보았지만 문제가 해결되지 않았습니다.그레이 화면 MapView - 안드로이드가있는 ArcGIS

여기 내 소스 코드입니다 : 당신은 바로 그와 같은 tileLayer는 IsInitialized 반환 값을 확인할 수 없습니다

06-18 10:51:21.413: E/ArcGIS(1544): url =http://services.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer 
06-18 10:51:21.413: E/ArcGIS(1544): org.codehaus.jackson.JsonParseException: Unexpected character ('<' (code 60)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') 
06-18 10:51:21.413: E/ArcGIS(1544): at [Source: [email protected]; line: 1, column: 2] 
06-18 10:51:21.413: E/ArcGIS(1544):  at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1432) 
06-18 10:51:21.413: E/ArcGIS(1544):  at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:521) 
06-18 10:51:21.413: E/ArcGIS(1544):  at org.codehaus.jackson.impl.JsonParserMinimalBase._reportUnexpectedChar(JsonParserMinimalBase.java:442) 
06-18 10:51:21.413: E/ArcGIS(1544):  at org.codehaus.jackson.impl.ReaderBasedParser._handleUnexpectedValue(ReaderBasedParser.java:1198) 
06-18 10:51:21.413: E/ArcGIS(1544):  at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(ReaderBasedParser.java:485) 
06-18 10:51:21.413: E/ArcGIS(1544):  at com.esri.core.internal.b.a.e.a(Unknown Source) 
06-18 10:51:21.413: E/ArcGIS(1544):  at com.esri.core.internal.b.a.e.a(Unknown Source) 
06-18 10:51:21.413: E/ArcGIS(1544):  at com.esri.core.internal.b.a.e.a(Unknown Source) 
06-18 10:51:21.413: E/ArcGIS(1544):  at com.esri.core.internal.a.a.m.b(Unknown Source) 
06-18 10:51:21.413: E/ArcGIS(1544):  at com.esri.android.map.ags.ArcGISTiledMapServiceLayer.initLayer(Unknown Source) 
06-18 10:51:21.413: E/ArcGIS(1544):  at com.esri.android.map.ags.ArcGISTiledMapServiceLayer$1.run(Unknown Source) 
06-18 10:51:21.413: E/ArcGIS(1544):  at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:444) 
06-18 10:51:21.413: E/ArcGIS(1544):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306) 
06-18 10:51:21.413: E/ArcGIS(1544):  at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
06-18 10:51:21.413: E/ArcGIS(1544):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088) 
06-18 10:51:21.413: E/ArcGIS(1544):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581) 
06-18 10:51:21.413: E/ArcGIS(1544):  at java.lang.Thread.run(Thread.java:1019) 
+0

HelloWorld 앱의 소스에 붙여 넣을 수 있습니까? –

+0

여기에 게시 됨. ArcGIS SDK에서 제공 한 원래 HelloWorld 코드와 약간 다르지만 앞서 언급 한 질문에서 코드를 시도했습니다. –

답변

2

:

public class HelloWorld extends Activity { 

    MapView map = null; 
    ArcGISTiledMapServiceLayer tileLayer; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     map = (MapView) findViewById(R.id.map); 
     tileLayer = new ArcGISTiledMapServiceLayer("http://services.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer"); 
     if(tileLayer.isInitialized() == true) //if a bad url is provided, this will fail 
     { map.addLayer(tileLayer); } 
     else{ 
       //if no layer is successfully added, the MapView will not initialize 
      Toast layerToast = Toast.makeText(this, "Layer didn't load, MapView won't initialize", Toast.LENGTH_LONG); 
      layerToast.show(); 
     } 

     map.setOnStatusChangedListener(new OnStatusChangedListener() { 
      private static final long serialVersionUID = 1L; 

      public void onStatusChanged(Object source, STATUS status) { 
       //conditional checks if mapView's status has changed to initialized 
       if (OnStatusChangedListener.STATUS.INITIALIZED == status && source == map) 
       { 
        Toast mapViewToast = Toast.makeText(HelloWorld.this, "MapView loaded", Toast.LENGTH_LONG); 
        mapViewToast.show(); 
       } 
      } 
     }); 

    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     map.pause(); 
} 
    @Override protected void onResume() { 
     super.onResume(); 
     map.unpause(); 
    } 

} 

여기 내 로그 캣입니다. 계층 초기화는 네트워크 호출을 만들고 비동기 적으로 완료됩니다.

원본 HelloWorld 샘플 코드와 마찬가지로 MapView에 먼저 추가해야합니다. 그러면 레이어가 초기화되기 시작합니다. 그런 다음 OnStatusChangedListener에서 시작된 이벤트를 검사하여 레이어 및/또는 맵을 초기화 할 수 있습니다.

+0

코드를 변경 한 후에도 동일한 오류가 발생하고 LogCat에서 알 수있는 것으로부터 예기치 않은 URL 반환을받을 수 있습니다. 그러나 URL을 입력하는 중 오류가 발생했는지 또는 내가 요청한 ArcGIS 서버와 관련된 것이 있는지 확실하지 않습니다. –

+0

나는 이것에 관해서 아직도 같은 오류를 얻고 있습니까? – Tony

0

특정 이유로 레이어 초기화를 확인할 필요가없는 경우 isInitialized()를 사용하지 않고 MapView에 추가하십시오.

진행하기 전에 레이어가 초기화되었는지 확인해야한다면 MapView와 같이 OnStatusChangedListener를 사용할 수 있습니다. 그런 다음 레이어의 상태가 INITIALIZED로 변경 될 때까지 기다렸다가 MapView에 추가 할 수 있습니다.

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    map = (MapView) findViewById(R.id.map); 
    tileLayer = new ArcGISTiledMapServiceLayer("http://services.arcgisonline.com/ArcGIS/rest/services/World_Shaded_Relief/MapServer"); 
    tileLayer.setOnStatusChangedListener(new OnStatusChangedListener() { 
     public void onStatusChanged(Object source, STATUS status) { 
      if (OnStatusChangedListener.STATUS.INITIALIZED == status){ 
       map.addLayer(tileLayer); //when layer is initialized add to map 
      } 
     } 
    }); 

    map.setOnStatusChangedListener(new OnStatusChangedListener() { 
     public void onStatusChanged(Object source, STATUS status) { 
      if (OnStatusChangedListener.STATUS.INITIALIZED == status) 
      { /*do something when mapView is initialized*/ } 
     } 
    }); 

}