2012-08-04 28 views
1

我试图在Android应用程序中使用Google地图。 MainActivity包含EditText,ImageButton和MapView。当用户给出一些查询并点击ImageButton时,MainAcitivity应该从一个url中获取一些JSON数据,然后当用户单击这些标记时,我需要使用该JSON数据来创建标记和dialogBox。每当我运行该应用程序,它运行良好。但是当我点击ImageButton时,应用程序停止给出logcat错误NetworkOnMainThreadException和StrickMode $ AndroidBlockGuardPolicy。我已附加logcat输出和MainActivity。我运行这个JSON程序创建其他测试项目,它工作得很好。但是当我将它添加到MainAcitivity时,它不起作用。我相信,android的安全策略正在阻止它从url获取数据。

那么,这个错误的原因是什么?我如何使这个活动起作用? 非常感谢各位朋友的关注。 如果您需要CustomOverlayItem对象或JSON对象的更多代码,请告诉我。

public class MainActivity extends MapActivity { 

     private List<Home> listHome = new ArrayList<Home>(); 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 

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

      MapView mv_map = (MapView) findViewById(R.id.mv_map); 
      MapController mapController = mv_map.getController(); 
      mv_map.setBuiltInZoomControls(true); 
      mapController.setZoom(5); 
      Markers markers = new Markers(this.getResources().getDrawable(
        R.drawable.ic_action_home), this); 
      CustomOverlayItem items = new CustomOverlayItem(getuserLocation(), 
        "Checking", "Checking"); 
      List<Overlay> overlays = mv_map.getOverlays(); 
      markers.addOverlayItem(items); 
      overlays.add(markers); 

      ImageButton ib_search = (ImageButton) findViewById(R.id.ib_search); 
      ib_search.setOnClickListener(new OnClickListener() { 

      @Override 
       public void onClick(View v) { 
        Json json = new Json(); 
        listHome = json.getListHome(); 
        EditText editText = (EditText) findViewById(R.id.et1_search); 
        editText.setText(listHome.get(0).getTitle().toString()); 
       } 
      }); 

     } 

     @Override 
     public boolean onCreateOptionsMenu(Menu menu) { 
      getMenuInflater().inflate(R.menu.activity_main, menu); 
      return true; 
     } 

     @Override 
     protected boolean isRouteDisplayed() { 
      return false; 
     } 

     private GeoPoint getuserLocation() { 
       GeoPoint geoPoint = new GeoPoint(19240000, -99120000); 
      return geoPoint; 
     } 
    } 

logcat的输出:当应用程序试图在其主thread.use AsyncTaskHandlerHandlerThread执行网络操作用于从服务器流汗的Json错误

08-04 16:26:55.253: E/Trace(1307): error opening trace file: No such file or directory (2) 
08-04 16:26:57.743: E/MapActivity(1307): Couldn't get connection factory client 
08-04 16:27:01.643: E/AndroidRuntime(1307): FATAL EXCEPTION: main 
08-04 16:27:01.643: E/AndroidRuntime(1307): android.os.NetworkOnMainThreadException 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at java.net.InetAddress.lookupHostByName(InetAddress.java:385) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:236) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at java.net.InetAddress.getAllByName(InetAddress.java:214) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:70) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:341) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:87) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at libcore.net.http.HttpConnection.connect(HttpConnection.java:128) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:315) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at libcore.net.http.HttpEngine.connect(HttpEngine.java:310) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:289) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:239) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:273) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:168) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at java.net.URL.openStream(URL.java:462) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at com.incubers.map.json.Json.getListHome(Json.java:33) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at com.incubers.map.MainActivity$1.onClick(MainActivity.java:53) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at android.view.View.performClick(View.java:4084) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at android.view.View$PerformClick.run(View.java:16966) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at android.os.Handler.handleCallback(Handler.java:615) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at android.os.Handler.dispatchMessage(Handler.java:92) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at android.os.Looper.loop(Looper.java:137) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at android.app.ActivityThread.main(ActivityThread.java:4745) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at java.lang.reflect.Method.invoke(Method.java:511) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
08-04 16:27:01.643: E/AndroidRuntime(1307):  at dalvik.system.NativeStart.main(Native Method) 
+0

这里Home是一个包含一些字符串及其getter和setter的bean。 – Nitin 2012-08-04 11:05:06

+0

首先搜索您的关键字:http://stackoverflow.com/search?q=NetworkOnMainThread+%5Bandroid%5D – StenaviN 2012-08-04 11:06:39

回答

1
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() 
    .detectAll() 
    .penaltyLog() 
    .penaltyDialog() 
    .build()); 

参考this

您还可以避免主要线程上的IO相关任务/

在UI上使用Handler,AsyncTask和post结果。

+0

我在StrictMode行上添加了代码。它现在停止在用户界面的消息“地图(process.com.incubers.map)违反了自我强制的StrictMode策略”对话框,然后它工作正常。它将这个对话框显示三次,然后显示它所预期的输出。解决了这个问题,但显示了这个对话框。 – Nitin 2012-08-04 11:30:51