首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >NetworkOnMainThread异常,安卓应用程序

NetworkOnMainThread异常,安卓应用程序
EN

Stack Overflow用户
提问于 2013-11-11 17:06:35
回答 3查看 983关注 0票数 1

我在我的android应用程序中使用osmdroid bonuspack,当我运行代码时,我得到了这个错误NetworkOnMainThread异常。

这是我的代码:

代码语言:javascript
运行
复制
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:

代码语言:javascript
运行
复制
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

EN

回答 3

Stack Overflow用户

发布于 2013-11-11 17:09:54

网络请求应使用异步任务。此链接将帮助您编写Async Tasks

票数 2
EN

Stack Overflow用户

发布于 2013-11-11 17:11:33

自从Android Honeycomb诞生以来,为了提高应用程序的响应性,它不允许使用网络任务在"main“线程或"ui”线程上执行。当你试图在“主线程”本身上执行网络操作时,Android抛出了一个名为NetworkOnMainThreadException的异常。

要解决此问题,您可以使用:- AsyncTask,一个工作线程(通过扩展Thread类,或使用Handler

如果要在网络连接关闭后更改UI或在网络连接正在进行时更新UI,则可以使用AsyncTask

如果您没有任何UI更新,则Thread%s更好。

票数 0
EN

Stack Overflow用户

发布于 2013-11-11 17:17:48

应避免在UI线程上执行长时间运行的操作。这包括文件和网络访问。

StrictMode允许在应用程序中设置策略,以避免做不正确的事情。例如,如果您的应用程序违反了某些Android策略,下面的设置将使其崩溃。StrictMode应该只在开发过程中使用,而不是在活动应用程序中使用。

代码语言:javascript
运行
复制
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
    .detectAll().penaltyLog().penaltyDeath().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectAll()
    .penaltyLog().penaltyDeath().build());

请按如下方式试用:

代码语言:javascript
运行
复制
@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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19902501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档