3

私のアプリケーションでは、JSONwebservice を使用して からデータを取得しますGoogle Navigation api。以下のコードを使用します。次の例外が発生しました

android.os.NetworkOnMainThreadException.

AsyncTask の使用方法 これが私のコードです。ありがとう。`public class MainActivity extends MapActivity {

  MapView mapView ;

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);

    System.out.println("*************1**************1");
    setContentView(R.layout.activity_main);
    System.out.println("*************2**************");
    mapView = (MapView) findViewById(R.id.mapv); 
    System.out.println("*************3**************");



                Route route = directions(new GeoPoint((int)(26.2*1E6),(int)(50.6*1E6)), new GeoPoint((int)(26.3*1E6),(int)(50.7*1E6)));

              RouteOverlay routeOverlay = new RouteOverlay(route, Color.BLUE);
              mapView.getOverlays().add(routeOverlay);
            mapView.invalidate();


    System.out.println("*************4**************");

}



@SuppressLint("ParserError")
private Route directions(final GeoPoint start, final GeoPoint dest) {



    //https://developers.google.com/maps/documentation/directions/#JSON <- get api
    String jsonURL = "http://maps.googleapis.com/maps/api/directions/json?";
    final StringBuffer sBuf = new StringBuffer(jsonURL);
    sBuf.append("origin=");
    sBuf.append(start.getLatitudeE6()/1E6);
    sBuf.append(',');
    sBuf.append(start.getLongitudeE6()/1E6);
    sBuf.append("&destination=");
    sBuf.append(dest.getLatitudeE6()/1E6);
    sBuf.append(',');
    sBuf.append(dest.getLongitudeE6()/1E6);
    sBuf.append("&sensor=true&mode=driving");

    Parser parser = new GoogleParser(sBuf.toString());
      Route   r =  parser.parse();
   System.out.println("********r in thread*****" +r);                  
            return r;
}



@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}
@Override
protected boolean isRouteDisplayed() {
    // TODO Auto-generated method stub
    return false;
}

} `

4

3 に答える 3

5

別のスレッドを使用するという@imran khanのアイデアは正しいものです。HoneyComb 以降では、UI スレッド内でネットワーク操作を行うことはできません。UI スレッドは、ビューの表示とタッチ イベントの受信を担当するスレッドであり、実行時間の長い操作によってブロックされないように、解放する必要があります。(そうしないと、Android で ANR が発生します)。

しかし、ネットワーク リクエストのような長時間実行される操作に AsyncTask を使用することは、実際にはあまり良い考えではありません。AsyncTask javadocs には、短時間の実行操作用に設計されているとさえ記載されています...

最良のアプローチは、そのためのサービスを使用することです。RoboSpice ライブラリからこのインフォグラフィックを読み、 RoboSpiceを使用することをお勧めします。これにより、ネットワークを使用したサービスの作成が容易になり、Spring Androidを使用して JSON コンテンツを簡単に解析できるようになります。

ここに画像の説明を入力

于 2012-12-02T07:22:09.980 に答える
3

Web サービスを使用してデータを取得するコードを AsyncTask クラスの doInBackground() メソッドに配置し、その結果をその関数から返すことができます。これは onPostExecute() メソッドで取得され、そこで UI を解析および更新できます。

private class myasyncclass extends AsyncTask<String, Void, Route>{
    @Override
    protected Route doInBackground(String... params) {
        //Enter code for fetching data from remote server using webservice
        return yourRoutevalue;
    }
    @Override
    protected void onPostExecute(Route result) {   
        //Enter code for parsing and using the data(Update UI)
    }
}

AsyncTask(DoInBackground, Progress, OnPostExecute) に同じタイプが必要です

于 2012-12-02T07:28:19.273 に答える
2

AsyncTask を使用するようにコードを変更します。

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
//Your Code here
new LongOperation().execute("");

System.out.println("*************4**************");

}

private class LongOperation extends AsyncTask<String, Void, String> {

      @Override
      protected Route  doInBackground(String... params) {
         Route route;
        try {
            route = directions(new GeoPoint((int)(26.2*1E6),
               (int)(50.6*1E6)), new GeoPoint((int)(26.3*1E6),(int)(50.7*1E6)));

        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
            return Route ;
      }      

      @Override
      protected void onPostExecute(Route  route) {    
        // Update Ui here    
           RouteOverlay routeOverlay = new RouteOverlay(route, Color.BLUE);
           mapView.getOverlays().add(routeOverlay);
           mapView.invalidate();       
      }

}

注 : UI 要素から HTTP REQUEST に値を渡す場合は、AsyncTask の doInBackground メソッドにパラメーターとして渡す必要があります。パラメータを AsyncTask に渡す方法は次のとおりです。

http://developer.android.com/reference/android/os/AsyncTask.html

于 2012-12-02T07:09:44.280 に答える