2012-08-04 25 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