2013-11-11 3 views
1

Я использую бонусный пакет osmdroid в моем приложении для Android, когда я запускаю код, я получаю эту ошибку NetworkOnMainThread Exception.NetworkOnMainThread Exception, android application

это мой код:

public class MainActivity extends Activity { 
    private MapView myOpenMapView; 
    private MapController mapController; 

     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 

      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      RoadManager roadManager = new OSRMRoadManager(); 

      myOpenMapView = (MapView) findViewById(R.id.openmapview); 
      myOpenMapView.setTileSource(TileSourceFactory.MAPNIK); 
      GeoPoint startPoint = new GeoPoint(48.13, -1.63); 
      MapController mapController = myOpenMapView.getController(); 
      mapController.setCenter(startPoint); 
      mapController.setZoom(9); 
      ArrayList<GeoPoint> waypoints = new ArrayList<GeoPoint>(); 
      waypoints.add(startPoint); 
      waypoints.add(new GeoPoint(48.4, -1.9)); //end point 
      Road road = roadManager.getRoad(waypoints); 
      PathOverlay roadOverlay = RoadManager.buildRoadOverlay(road, myOpenMapView.getContext()); 
      myOpenMapView.getOverlays().add(roadOverlay); 
      myOpenMapView.invalidate(); 
     // RoadManager roadManager = new MapQuestRoadManager(); 
      roadManager.addRequestOption("routeType=bicycle"); 


      final ArrayList<ExtendedOverlayItem> roadItems = 
         new ArrayList<ExtendedOverlayItem>(); 
        ItemizedOverlayWithBubble<ExtendedOverlayItem> roadNodes = 
         new ItemizedOverlayWithBubble<ExtendedOverlayItem>(this, roadItems, myOpenMapView); 
        myOpenMapView.getOverlays().add(roadNodes); 

        Drawable marker = getResources().getDrawable(R.drawable.marker); 
         for (int i=0; i<road.mNodes.size(); i++){ 
           RoadNode node = road.mNodes.get(i); 
           ExtendedOverlayItem nodeMarker = new ExtendedOverlayItem("Step "+i, "", node.mLocation, this); 
           nodeMarker.setMarkerHotspot(OverlayItem.HotspotPlace.CENTER); 
           nodeMarker.setMarker(marker); 
           roadNodes.addItem(nodeMarker); 

         nodeMarker.setDescription(node.mInstructions); 
         nodeMarker.setSubDescription(road.getLengthDurationText(node.mLength, node.mDuration)); 
         Drawable icon = getResources().getDrawable(R.drawable.ic_launcher); 
         nodeMarker.setImage(icon); 

         } 

}} 

и это LogCat:

11-11 04:00:01.916: E/AndroidRuntime(1040): FATAL EXCEPTION: main 
11-11 04:00:01.916: E/AndroidRuntime(1040): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.openstreetbonus/com.example.openstreetbonus.MainActivity}: android.os.NetworkOnMainThreadException 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at android.app.ActivityThread.access$600(ActivityThread.java:141) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at android.os.Looper.loop(Looper.java:137) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at android.app.ActivityThread.main(ActivityThread.java:5103) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at java.lang.reflect.Method.invoke(Method.java:525) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at dalvik.system.NativeStart.main(Native Method) 
11-11 04:00:01.916: E/AndroidRuntime(1040): Caused by: android.os.NetworkOnMainThreadException 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1133) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at java.net.InetAddress.getAllByName(InetAddress.java:214) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at org.osmdroid.bonuspack.utils.HttpConnection.doGet(HttpConnection.java:75) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at org.osmdroid.bonuspack.routing.OSRMRoadManager.getRoad(OSRMRoadManager.java:204) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at com.example.openstreetbonus.MainActivity.onCreate(MainActivity.java:46) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at android.app.Activity.performCreate(Activity.java:5133) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087) 
11-11 04:00:01.916: E/AndroidRuntime(1040):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 

Я последовал за учебник на этом сайте: https://code.google.com/p/osmbonuspack/wiki/Tutorial_1

+5

переведите свою связанную с сетью операцию в поток или асинтекс – Raghunandan

+0

, воспользуйтесь фоновой задачей для доступа к Интернету в основной теме. вы можете использовать метод «AsyncTask» или «runonuithread». – Andrain

+0

@Raghunandan У меня нет связанной с сетью операции –

ответ

2

Вы должны использовать задачу асинхронной для запроса сети , Эта ссылка поможет вам написать Async Tasks

+0

У меня нет сетевого запроса в моем коде! –

+0

Вы наиболее определенно работаете в коде (возможно, из библиотеки), к которому обращается ваш код. –

0

С момента создания Android Honeycomb, чтобы приложения стали более отзывчивыми, было запрещено использовать сетевые задачи для выполнения «основной» нити или потока «ui». Поскольку вы пытаетесь выполнить сетевые операции в самом «основном» потоке, Android выдает исключение сладко названное NetworkOnMainThreadException.

Чтобы обойти эту проблему, можно использовать: - AsyncTask, рабочий поток (путем расширения Thread класса, или использовать Handler s

Вы можете использовать AsyncTask, когда вы хотите внести изменения пользовательского интерфейса после подключения к сети закрытое или обновить пользовательский интерфейс в качестве сетевого подключения в процессе.

Thread s лучше, если вы не имеете никакого updations UI.

0

вы должны избегать выполнения длительных операций в потоке пользовательского интерфейса. Они включают в себя s файл и доступ к сети.

StrictMode позволяет устанавливать политики в вашем приложении, чтобы избежать неправильных действий. Например, следующая настройка приведет к краху вашего приложения, если оно нарушит некоторые из политик Android. StrictMode следует использовать только во время разработки, а не в вашем реальном приложении.

StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
    .detectAll().penaltyLog().penaltyDeath().build()); 
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll() 
    .penaltyLog().penaltyDeath().build()); 

Попробуйте, как показано ниже:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);  
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
    StrictMode.setThreadPolicy(policy); 
} 
0

Ваш Exception на самом деле говорит вам именно то, что вы делаете неправильно. Вы не используете другой поток для выполнения NetworkOperations.

Ваш код, который соединяется с URL-адресом, должен быть выполнен внутри метода AsyncTasksdoInBackground(), с UI-Thread.

Используйте следующий код.

private class UpdateTask extends AsyncTask<String, String,String> { 
    protected String doInBackground(String... urls) { 

     DefaultHttpClient httpClient = new DefaultHttpClient(); 
     HttpPost httpPost = new HttpPost(url); 

     HttpResponse httpResponse = httpClient.execute(httpPost); 
     HttpEntity httpEntity = httpResponse.getEntity(); 
     is = httpEntity.getContent(); 
     return null; 
    } 

} 

и в вашем ManinActivity Используйте следующий код.

new UpdateTask().execute(); 
+0

Я не использую никакой сетевой операции в моем коде !!! Я просто использую OSMBonusPack в качестве библиотеки в своем проекте –

+0

Как вы ожидаете, что сможете взаимодействовать с онлайн-картой уличной карты без использования сетевых операций ??? –

+0

@ChrisStratton Я делаю учебник по openstrretmap, и нет никакой операции, связанной с сетью, в коде вы правы; Я знаю, но где я могу использовать AysckTask в своем коде? –

Смежные вопросы