2013-03-28 90 views
0

在我的Android項目中,我將Google API稱爲獲取xml以獲取兩點之間的方向。我有一個名爲Getdirections.java的類,我創建了一個GMapV2Direction.java類的實例。在GMapV2Direction.java中,我調用Google api並解析xml。 在Android 2.3以下的設備,其工作正常,但在Android 4中,其獲取NetworkOnManinThreadException。 這是我的GMapV2Direction.java文件。如何在Android項目中的Java類中實現api調用?

import java.io.InputStream; 
import java.util.ArrayList; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 

import org.apache.http.HttpResponse; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.protocol.BasicHttpContext; 
import org.apache.http.protocol.HttpContext; 
import org.w3c.dom.Document; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

import com.google.android.gms.maps.model.LatLng; 

import android.util.Log; 

public class GMapV2Direction { 
public final static String MODE_DRIVING = "driving"; 
public final static String MODE_WALKING = "walking"; 

public GMapV2Direction() { } 

public Document getDocument(LatLng start, LatLng end, String mode) { 
    String url = "http://maps.googleapis.com/maps/api/directions/xml?" 
      + "origin=" + start.latitude + "," + start.longitude 
      + "&destination=" + end.latitude + "," + end.longitude 
      + "&sensor=false&units=metric&mode=driving"; 

    try { 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpContext localContext = new BasicHttpContext(); 
     HttpPost httpPost = new HttpPost(url); 
     HttpResponse response = httpClient.execute(httpPost, localContext); 
     InputStream in = response.getEntity().getContent(); 
     DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
     Document doc = builder.parse(in); 
     return doc; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 

public String getDurationText (Document doc) { 
    NodeList nl1 = doc.getElementsByTagName("duration"); 
    Node node1 = nl1.item(0); 
    NodeList nl2 = node1.getChildNodes(); 
    Node node2 = nl2.item(getNodeIndex(nl2, "text")); 
    Log.i("DurationText", node2.getTextContent()); 
    return node2.getTextContent(); 
} 

public int getDurationValue (Document doc) { 
    NodeList nl1 = doc.getElementsByTagName("duration"); 
    Node node1 = nl1.item(0); 
    NodeList nl2 = node1.getChildNodes(); 
    Node node2 = nl2.item(getNodeIndex(nl2, "value")); 
    Log.i("DurationValue", node2.getTextContent()); 
    return Integer.parseInt(node2.getTextContent()); 
} 

public String getDistanceText (Document doc) { 
    NodeList nl1 = doc.getElementsByTagName("distance"); 
    Node node1 = nl1.item(0); 
    NodeList nl2 = node1.getChildNodes(); 
    Node node2 = nl2.item(getNodeIndex(nl2, "text")); 
    Log.i("DistanceText", node2.getTextContent()); 
    return node2.getTextContent(); 
} 

public int getDistanceValue (Document doc) { 
    NodeList nl1 = doc.getElementsByTagName("distance"); 
    Node node1 = nl1.item(0); 
    NodeList nl2 = node1.getChildNodes(); 
    Node node2 = nl2.item(getNodeIndex(nl2, "value")); 
    Log.i("DistanceValue", node2.getTextContent()); 
    return Integer.parseInt(node2.getTextContent()); 
} 

public String getStartAddress (Document doc) { 
    NodeList nl1 = doc.getElementsByTagName("start_address"); 
    Node node1 = nl1.item(0); 
    Log.i("StartAddress", node1.getTextContent()); 
    return node1.getTextContent(); 
} 

public String getEndAddress (Document doc) { 
    NodeList nl1 = doc.getElementsByTagName("end_address"); 
    Node node1 = nl1.item(0); 
    Log.i("StartAddress", node1.getTextContent()); 
    return node1.getTextContent(); 
} 

public String getCopyRights (Document doc) { 
    NodeList nl1 = doc.getElementsByTagName("copyrights"); 
    Node node1 = nl1.item(0); 
    Log.i("CopyRights", node1.getTextContent()); 
    return node1.getTextContent(); 
} 

public ArrayList<LatLng> getDirection (Document doc) { 
    NodeList nl1, nl2, nl3; 
    ArrayList<LatLng> listGeopoints = new ArrayList<LatLng>(); 
    nl1 = doc.getElementsByTagName("step"); 
    if (nl1.getLength() > 0) { 
     for (int i = 0; i < nl1.getLength(); i++) { 
      Node node1 = nl1.item(i); 
      nl2 = node1.getChildNodes(); 

      Node locationNode = nl2.item(getNodeIndex(nl2, "start_location")); 
      nl3 = locationNode.getChildNodes(); 
      Node latNode = nl3.item(getNodeIndex(nl3, "lat")); 
      double lat = Double.parseDouble(latNode.getTextContent()); 
      Node lngNode = nl3.item(getNodeIndex(nl3, "lng")); 
      double lng = Double.parseDouble(lngNode.getTextContent()); 
      listGeopoints.add(new LatLng(lat, lng)); 

      locationNode = nl2.item(getNodeIndex(nl2, "polyline")); 
      nl3 = locationNode.getChildNodes(); 
      latNode = nl3.item(getNodeIndex(nl3, "points")); 
      ArrayList<LatLng> arr = decodePoly(latNode.getTextContent()); 
      for(int j = 0 ; j < arr.size() ; j++) { 
       listGeopoints.add(new LatLng(arr.get(j).latitude, arr.get(j).longitude)); 
      } 

      locationNode = nl2.item(getNodeIndex(nl2, "end_location")); 
      nl3 = locationNode.getChildNodes(); 
      latNode = nl3.item(getNodeIndex(nl3, "lat")); 
      lat = Double.parseDouble(latNode.getTextContent()); 
      lngNode = nl3.item(getNodeIndex(nl3, "lng")); 
      lng = Double.parseDouble(lngNode.getTextContent()); 
      listGeopoints.add(new LatLng(lat, lng)); 
     } 
    } 

    return listGeopoints; 
} 

private int getNodeIndex(NodeList nl, String nodename) { 
    for(int i = 0 ; i < nl.getLength() ; i++) { 
     if(nl.item(i).getNodeName().equals(nodename)) 
      return i; 
    } 
    return -1; 
} 

private ArrayList<LatLng> decodePoly(String encoded) { 
    ArrayList<LatLng> poly = new ArrayList<LatLng>(); 
    int index = 0, len = encoded.length(); 
    int lat = 0, lng = 0; 
    while (index < len) { 
     int b, shift = 0, result = 0; 
     do { 
      b = encoded.charAt(index++) - 63; 
      result |= (b & 0x1f) << shift; 
      shift += 5; 
     } while (b >= 0x20); 
     int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
     lat += dlat; 
     shift = 0; 
     result = 0; 
     do { 
      b = encoded.charAt(index++) - 63; 
      result |= (b & 0x1f) << shift; 
      shift += 5; 
     } while (b >= 0x20); 
     int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); 
     lng += dlng; 

     LatLng position = new LatLng((double) lat/1E5, (double) lng/1E5); 
     poly.add(position); 
    } 
    return poly; 
} 

}

這是從哪兒我實例GMapV2Direction.java我Getdirection.java文件。

public class GetDirectionsActivity extends FragmentActivity { 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.getdirections); 
.... 
.... 
.... 
Document doc = md.getDocument(userLocation, toPosition, 
      GMapV2Direction.MODE_DRIVING); 
    ArrayList<LatLng> directionPoint = md.getDirection(doc); 
    PolylineOptions rectLine = new PolylineOptions().width(3).color(
      Color.RED); 

    for (int i = 0; i < directionPoint.size(); i++) { 
     rectLine.add(directionPoint.get(i)); 
    } 

    map.addPolyline(rectLine); 

.... 
.... 
.... 
} 
} 

請給出一個建議,以便我可以處理這個異常。我的文件中的任何編輯是受歡迎的!

回答

0

NetworkOnMainThreadException是因爲當您嘗試訪問您的主線程上的互聯網。將您訪問互聯網的代碼放入AyncTask

public class DemoAsyncTask extends AsyncTask<Integer, Void, Void> { 

    ProgressDialog progressDialog; 
    Context context; 

    public DemoAsyncTask(Context context) { 
     this.context = context; 
    } 

    @Override 
    protected void onPreExecute() { 
     progressDialog = ProgressDialog.show(context, "Title", "Message"); 
     super.onPreExecute(); 
    } 


    @Override 
    protected Void doInBackground(Integer... params) { 
     // call your method here 
     return null; 
    } 


    @Override 
    protected void onPostExecute(Void result) { 
     progressDialog.dismiss(); 
     super.onPostExecute(result); 
    } 
} 

把它放進一個單獨的文件名DemoAsyncTask.java

+0

我知道。我只想知道如何在簡單的java文件中擴展Asynctask,而不是在Android活動中。 – 2013-03-28 09:17:53

+0

@ParijatBose檢查我更新的答案 – 2013-03-28 09:26:04

0

這裏就是答案。

import java.util.ArrayList; 

import org.w3c.dom.Document; 

import android.app.Dialog; 
import android.content.Intent; 
import android.graphics.Color; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationManager; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.google.android.gms.maps.CameraUpdateFactory; 
import com.google.android.gms.maps.GoogleMap; 
import com.google.android.gms.maps.GoogleMapOptions; 
import com.google.android.gms.maps.SupportMapFragment; 
import com.google.android.gms.maps.model.BitmapDescriptorFactory; 
import com.google.android.gms.maps.model.LatLng; 
import com.google.android.gms.maps.model.MarkerOptions; 
import com.google.android.gms.maps.model.PolylineOptions; 


public class GetDirectionsActivity extends FragmentActivity { 

private String provider; 
double lati; 
double longi; 
String name; 
GMapV2Direction md; 
GoogleMap map; 

Location location; 

LatLng userLocation, toPosition; 

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

} 


private class ParseXML extends AsyncTask<Void, Void, Document> { 
    Document doc; 
    PolylineOptions rectLine; 
    @Override 
    protected Document doInBackground(Void... params) { 
     doc = md.getDocument(userLocation, toPosition, 
       GMapV2Direction.MODE_DRIVING); 
     ArrayList<LatLng> directionPoint = md.getDirection(doc); 
     rectLine = new PolylineOptions().width(3).color(
       Color.RED); 

     for (int i = 0; i < directionPoint.size(); i++) { 
      rectLine.add(directionPoint.get(i)); 
     } 
     return null; 

    } 

    @Override 
    protected void onPostExecute(Document result) { 
     // TODO Auto-generated method stub 
     map.addPolyline(rectLine); 
    } 

} 

} 

而不用在主類的實例,我創建的實例中的AsyncTask調用谷歌的API ..其餘的AsyncTask做.... :)

相關問題