2012-12-02 18 views
3

在我的應用程序中,我使用JSON webservice從Google Navigation api獲取數據。我使用的代碼如下。 我得到以下例外如何在android的AsyncTask中使用方法?

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

} `

+0

Android不使用谷歌地圖API V3。 (標記刪除) – Marcelo

回答

5

@imran汗的想法是正確的。從HoneyComb及以上版本開始,您無法在UI線程內進行任何聯網操作。 UI線程是負責顯示視圖和接收觸摸事件的線程,它必須是免費的,而不是由長時間運行的操作阻止。 (否則你在Android上有ANR)。

但是,對於網絡請求等長時間運行操作,使用AsyncTask實際上並不是一個好主意。 AsyncTask javadocs甚至聲明它們已經設計用於短期運行操作...

最好的方法是使用該服務。我建議您從RoboSpice庫中讀取infographics,並使用RoboSpice,它將簡化使用網絡創建服務的步驟,並使您可以更輕鬆地使用Spring Android解析您的json內容。

enter image description here

+0

真棒迴應!感謝分享! –

+0

Thx。我很猶豫在這裏發佈信息圖,但看起來它有幫助;) – Snicolas

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請求,那麼你必須將它作爲參數傳遞給AsyncTask的doInBackground方法。你可以看到我們是如何傳遞參數給這裏的AsyncTask:使用另一個線程的

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

+0

非常感謝你 – Palaniraja

3

你可以把你的代碼中獲取類的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)

相關問題