2014-11-04 4 views
0

У меня есть ящик для навигации и некоторые задачи async, которые будут выполняться в фоновом режиме. То, что я пытаюсь сделать, - это когда определенный элемент был выбран из ящика навигации, я затем выполняю метод, который выполняется в фоновом режиме в async-задаче. Вот код, где-то был выбран из навигационного ящика:Android Async Task NetworkOnMainThreadException

private void selectItem(int position) { 
    selectedPosition = position; 
    mDrawerLayout.closeDrawer(navDrawerView); 

    switch (selectedPosition) { 
    case 0: 
     try { 
      ViewEventsOnMap(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     Toast.makeText(ENeighbourhoodActivity.this, "Press and hold at the area where you wish to create an event!", 
       Toast.LENGTH_LONG).show(); 
     break; 
    case 1: 
     Toast.makeText(ENeighbourhoodActivity.this, "Analyze Event", 
       Toast.LENGTH_LONG).show(); 
     break; 
    } 

    setTitle(mEventSelection[selectedPosition]); 

} 

И мой асинхронной класс Задачи:

private class MyAsyncTask extends AsyncTask<Void, Integer, Double> { 
    @Override 
    protected Double doInBackground(Void... params) { 
     try { 
      ViewEventsOnMap(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    protected void onPostExecute(Double result) { 
    } 

    protected void onProgressUpdate(Integer... progress) { 
    } 
} 

Я назвал этот асинхронный класс задач при OnCreate поэтому он не зависит от того, который был выбран пункт из навигационного ящика.

public void ViewEventsOnMap() throws JSONException { 
    String page; 
    JSONArray jsonArray; 

    try { 
     HttpClient client = new DefaultHttpClient(); 
     HttpGet request = new HttpGet(URL); 
     HttpResponse response = client.execute(request); 
     HttpEntity entity = response.getEntity(); 
     try { 
      // Codes to retrieve data from servlet and plot marker onto the map 
      } 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Но с этими кодами, я получаю эти сообщения об ошибках:

11-04 20:54:45.642: W/dalvikvm(25527): threadid=1: thread exiting with uncaught exception (group=0x40c3f1f8) 
11-04 20:54:45.673: E/AndroidRuntime(25527): FATAL EXCEPTION: main 
11-04 20:54:45.673: E/AndroidRuntime(25527): android.os.NetworkOnMainThreadException 
11-04 20:54:45.673: E/AndroidRuntime(25527): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at libcore.io.IoBridge.connectErrno(IoBridge.java:127) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at libcore.io.IoBridge.connect(IoBridge.java:112) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at java.net.Socket.connect(Socket.java:842) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:119) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:144) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:465) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at nyp.edu.eneighbourhood.ENeighbourhoodActivity.ViewEventsOnMap(ENeighbourhoodActivity.java:204) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at nyp.edu.eneighbourhood.ENeighbourhoodActivity.selectItem(ENeighbourhoodActivity.java:385) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at nyp.edu.eneighbourhood.ENeighbourhoodActivity.access$4(ENeighbourhoodActivity.java:378) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at nyp.edu.eneighbourhood.ENeighbourhoodActivity$5.onChildClick(ENeighbourhoodActivity.java:341) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at android.widget.ExpandableListView.handleItemClick(ExpandableListView.java:584) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at android.widget.ExpandableListView.performItemClick(ExpandableListView.java:521) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at android.widget.AbsListView$PerformClick.run(AbsListView.java:2713) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at android.widget.AbsListView$1.run(AbsListView.java:3468) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at android.os.Handler.handleCallback(Handler.java:605) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at android.os.Handler.dispatchMessage(Handler.java:92) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at android.os.Looper.loop(Looper.java:137) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at android.app.ActivityThread.main(ActivityThread.java:4512) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at java.lang.reflect.Method.invokeNative(Native Method) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at java.lang.reflect.Method.invoke(Method.java:511) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:982) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:749) 
11-04 20:54:45.673: E/AndroidRuntime(25527): at dalvik.system.NativeStart.main(Native Method) 

Все гиды? Заранее спасибо.

ответ

3

Вы написали класс AsyncTask, и вы не используете его. Трассировка стека показывает, что вы вызываете ViewEventsOnMap() из selectItem() в основной поток приложений и что вы не используете MyAsyncTask в любом месте.

+0

viewEventsOnMap() должны делать в фоновом режиме, и я назвал класс задач асинхронной, когда при создании файла. Поэтому, когда моя карта загружается, она сразу же показывает все маркеры, не выбирая меня из навигационного ящика. –

+0

@IWasSoLost: «Представление viewEventsOnMap() должно выполняться в фоновом режиме» - не в соответствии с кодом, который вы написали. «Я назвал класс задачи async, когда на создании» - это не имеет значения, так как вы не * вызываете его из 'selectItem()', из которого происходит ваше 'NetworkOnMainThreadException'. – CommonsWare

+0

У вас есть идеи, чтобы я мог крутить мои коды, чтобы работать в ожидаемом? –

1

Вы не используете AsyncTask для своих сетевых вызовов. Вы написали AsyncTask, но не совсем использовали его.

При выборе элемента в навигационном ящике вы вызываете метод ViewEventsOnMap(), который работает по потоку пользовательского интерфейса.

Вместо того, чтобы делать, что вы должны обратить ваше AsycnTask

+0

Представление viewEventsOnMap() должно выполняться в фоновом режиме, и я вызывал класс задач async при создании. Поэтому, когда моя карта загружается, она сразу же показывает все маркеры, не выбирая меня из навигационного ящика. –

+0

Метод ViewEventsOnMap() выполняет сетевой вызов, и он должен находиться внутри AsyncTask без какого-либо выбора. Найдите обходной путь. – Rohit5k2

+0

Но есть ли у вас идеи? –