-->

如何在Android的使用方法的AsyncTask?(how to use method in As

2019-07-04 09:12发布

在我的应用程序使用JSON网络服务来获取数据从Google Navigation api 。 我使用的代码如下。 我得到了以下异常

android.os.NetworkOnMainThreadException

如何使用的AsyncTask? 这里是我的代码。 Thanks.`public类MainActivity扩展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;
}

}`

Answer 1:

@imran汗使用另一个线程的想法是正确的。 从蜂窝及以上的,你不能这样做的UI线程内任何网络操作。 在UI线程负责显示观点和接收触摸事件,它必须为这个是免费的,不被长时间运行操作的线程。 (否则你有在Android的ANR)。

但是,它实际上不使用的AsyncTask像一个网络请求长时间运行的操作一个非常好的主意。 该的AsyncTask的javadoc,甚至指出他们已经设计了短捉迷藏操作...

最好的方法是使用服务这一点。 我建议您阅读此信息图表从RoboSpice库,并使用RoboSpice ,这将减轻创建与网络服务,将使它更容易为你解析使用JSON内容春天的Android 。



Answer 2:

你可以把你的代码中获取类的AsyncTask的doInBackground()方法使用web服务的数据和结果从该函数返回。 这将让你在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,进步,OnPostExecute)



Answer 3:

更改您的代码为使用的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请求,那么你必须把它作为参数的AsyncTask的doInBackground方法。 你可以看到我们是如何传递参数给这里的AsyncTask:

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



文章来源: how to use method in AsyncTask in android?