0

ArcGIS with Android SDK を使用して、サンプルの HelloWorld アプリケーションを試しています。コードは正常にコンパイルされますが、実行時に灰色の画面が表示されます。この質問を見てみましたが、私の問題は解決しません。

ここに私のソースコードがあります:

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

}

これが私のLogCatです:

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: java.io.StringReader@4057ed68; 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)
4

2 に答える 2

2

そのように tileLayer isInitialized の戻り値をすぐに確認することはできません。層の初期化はネットワーク呼び出しを行い、非同期で行われます。

元の HelloWorld サンプル コードと同様に、最初に MapView に追加する必要があります。これにより、レイヤーの初期化が開始されます。次に、レイヤーやマップの初期化のために OnStatusChangedListener から発生したイベントを確認できます。

于 2012-06-18T17:17:40.220 に答える
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*/  }
        }
    });

}
于 2012-06-19T19:15:19.980 に答える