2013-12-03 4 views
0

Я хочу получить данные из Интернета с помощью JSON, я использую класс AsynkTask, чтобы сделать это и его работу, но если я добавлю или изменим код и запустим мою программу снова он перестает работать с android.os.NetworkOnMainThreadException Но я никогда не запускал этот код на main thread, и я должен нажать на fix project, затем clean и запустить снова, и он снова работает отлично, в чем проблема? Мой код, который работает следующим образом:android.os.NetworkOnMainThreadException в AsynkTask Class

public class NetworkDocStateThread extends AsyncTask<String, Void, Void> { 

    HttpResponse responseState; 

    @Override 
    protected Void doInBackground(String... params) { 

     try { 
      responseState = JsonDocumnet 
        .SendDocumentState(Financial.selectedGuId); 

     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void post) { 
     try { 

      Financial.documnetStateDs = JsonDocumnet 
        .DocumentState(responseState); 

       documentStateSpinner.add(Financial.documnetStateDs.get(i) 
         .getTitle()); 
      } 

      SpinnerStateAdapter = new ArrayAdapter<String>(Documnet.this, 
        R.layout.spinnlayout, R.id.docstateid, 
        documentStateSpinner); 


      SpinnerNumAdapter = new ArrayAdapter<String>(Documnet.this, 
        R.layout.spinnlayout, R.id.docstateid, getResources() 
          .getStringArray(R.array.numPerPage)); 

      SpinnerSortAdapter = new ArrayAdapter<String>(Documnet.this, 
        R.layout.spinnlayout, R.id.docstateid, getResources() 
        .getStringArray(R.array.SortBy)); 

      new NetworkDocThread().execute(Financial.selectedGuId, "5", 

        "0", "Id", "-1"); 

      docStateSpinner.setAdapter(SpinnerStateAdapter); 
      NumberPerPageSpinner.setAdapter(SpinnerNumAdapter); 
      SortBySpinner.setAdapter(SpinnerSortAdapter); 

     } catch (IllegalStateException e) { 

      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     super.onPostExecute(post); 
    } 

} 

и второй класс AsyncTask:

public class NetworkDocThread extends AsyncTask<String, Void, Void> { 

    HttpResponse responseDoc; 

    @Override 
    protected Void doInBackground(String... s) { 
     try { 
      responseDoc = JsonDocumnet.SendDocumnet(s[0], s[1], s[2], s[3], 
        s[4]); 

     } catch (ClientProtocolException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Void post) { 


      try { 
       Financial.docs = JsonDocumnet.Document(responseDoc); 
       CreatingData(); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } catch (JSONException e) { 
       ; 
      } 

      dialog.dismiss(); 


     } 
    } 
} 

и файл манифеста:

<uses-permission android:name="android.permission.INTERNET" /> 

и моя LogCat ошибка

12-03 05:08:43.022: E/AndroidRuntime(1106): FATAL EXCEPTION: main 
    12-03 05:08:43.022: E/AndroidRuntime(1106): android.os.NetworkOnMainThreadException 
    12-03 05:08:43.022: E/AndroidRuntime(1106):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1117) 
    12-03 05:08:43.022: E/AndroidRuntime(1106):  at libcore.io.BlockGuardOs.recvfrom(BlockGuardOs.java:163) 
    12-03 05:08:43.022: E/AndroidRuntime(1106):  at libcore.io.IoBridge.recvfrom(IoBridge.java:513) 
    12-03 05:08:43.022: E/AndroidRuntime(1106):  at java.net.PlainSocketImpl.read(PlainSocketImpl.java:488) 
    12-03 05:08:43.022: E/AndroidRuntime(1106):  at java.net.PlainSocketImpl.access$000(PlainSocketImpl.java:46) 
    12-03 05:08:43.022: E/AndroidRuntime(1106):  at java.net.PlainSocketImpl$PlainSocketInputStream.read(PlainSocketImpl.java:240) 
    12-03 05:08:43.022: E/AndroidRuntime(1106):  at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:103) 
    12-03 05:08:43.022: E/AndroidRuntime(1106):  at org.apache.http.impl.io.AbstractSessionInputBuffer.read(AbstractSessionInputBuffer.java:134) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at org.apache.http.impl.io.ContentLengthInputStream.read(ContentLengthInputStream.java:174) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at org.apache.http.conn.EofSensorInputStream.read(EofSensorInputStream.java:159) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at java.io.InputStreamReader.read(InputStreamReader.java:244) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at java.io.BufferedReader.fillBuf(BufferedReader.java:130) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at java.io.BufferedReader.readLine(BufferedReader.java:354) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at json.JsonDocumnet.Documen(JsonDocumnet.java:200) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at activity.Documnet$NetworkDocThread.onPostExecute(Documnet.java:375) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at activity.Documnet$NetworkDocThread.onPostExecute(Documnet.java:1) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at android.os.AsyncTask.finish(AsyncTask.java:631) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at android.os.AsyncTask.access$600(AsyncTask.java:177) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at android.os.Handler.dispatchMessage(Handler.java:99) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at android.os.Looper.loop(Looper.java:137) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at android.app.ActivityThread.main(ActivityThread.java:5041) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at java.lang.reflect.Method.invokeNative(Native Method) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at java.lang.reflect.Method.invoke(Method.java:511) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 
    12-03 05:08:43.022: E/AndroidRuntime(1106): at dalvik.system.NativeStart.main(Native Method) 

Я использую классы 2 AsynkTask, потому что мне нужны данные первого класса во втором классе, и я не могу делать сетевые ввод-вывод в onPostExecuteAsyncTask.

РЕДАКТИРОВАТЬ ////////////////////

и функции докумен:

public static DocumentDS Documen(HttpResponse response) throws IOException, JSONException 
{ 
    String split[] ; 
    List<DocumentInfoDS> dslis = new ArrayList<DocumentInfoDS>(); 
    split = response.getStatusLine().toString().split(" "); 
    for (int i = 0 ; i < split.length ; i++) 
    { 
     Log.d("status code is", split[i]); 
    } 
    Log.d("status code is", split[1]); 

    switch (Integer.valueOf(split[1])/100) 
    {   
    case 2: 

     Log.d("IN Switch STATMENT", "2"); 
     in = new BufferedReader(new InputStreamReader(response 
        .getEntity().getContent())); 


     StringBuffer sb = new StringBuffer(""); 
     String line = ""; 
     String NL = System.getProperty("line.separator"); 

     while ((line = in.readLine()) != null) { 
      Log.d("line is", line); 
      sb.append(line + NL); 
     } 

     Log.d("after setting data", "1234"); 
     in.close(); 
     json = sb.toString(); 

     JSONObject jsonObj = new JSONObject(json); 
     docs = new DocumentDS(); 
     docs.SetDocCount(jsonObj.getInt(TAG_Count)); 
     JSONArray jsonArray = new JSONArray(jsonObj.getString(TAG_Docs)); 




     for (int i = 0; i < jsonArray.length(); i++) { 
      JSONObject temp = jsonArray.getJSONObject(i); 
      DocumentInfoDS ds = new DocumentInfoDS(); 

      ds.SetGuId(temp.getString(TAG_Id)); 
      ds.SetTitle(temp.getString(TAG_Title)); 
      ds.SetStateID(temp.getInt(TAG_StateId)); 
      ds.SetCreateDate(temp.getString(TAG_CreateDate)); 
      ds.SetDocumnetNumber(temp.getInt(TAG_DocumentNum)); 

      dslis.add(ds); 
      } 

     docs.SetList(dslis); 



     Log.d("lenght is", String.valueOf(dslis.size())); 
     break; 
    } 
    return docs; 

линии 200 в то время как ((строка = в. ReadLine())! = NULL)

+0

Разрешение на использование Интернета в файле манифеста? – RobinHood

+0

Вы даете разрешение на интернет? – Karthi

+0

Опубликовать свой журнал cat –

ответ

1

Вы просто получить ссылку на HttpResponse я n doInBackground. но все операции чтения/записи в HttpResponse также связаны с работой сети. и вы читаете из HttpResponse в onPOstExecute(), который запускается в потоке пользовательского интерфейса. и попробуйте это ...

public class NetworkDocStateThread extends AsyncTask<String, Void, Void> { 


    @Override 
    protected Void doInBackground(String... params) { 

     try { 
      HttpResponse responseState = JsonDocumnet 
        .SendDocumentState(Financial.selectedGuId); 
      Financial.documnetStateDs = JsonDocumnet 
        .DocumentState(responseState); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
     } 

     return null; 
    } 

    @Override 
    protected void onPostExecute(Void post) { 
     try { 


      documentStateSpinner.add(Financial.documnetStateDs.get(i) 
        .getTitle()); 

      SpinnerStateAdapter = new ArrayAdapter<String>(Documnet.this, 
        R.layout.spinnlayout, R.id.docstateid, 
        documentStateSpinner); 

      SpinnerNumAdapter = new ArrayAdapter<String>(Documnet.this, 
        R.layout.spinnlayout, R.id.docstateid, getResources() 
          .getStringArray(R.array.numPerPage)); 

      SpinnerSortAdapter = new ArrayAdapter<String>(Documnet.this, 
        R.layout.spinnlayout, R.id.docstateid, getResources() 
          .getStringArray(R.array.SortBy)); 

      new NetworkDocThread().execute(Financial.selectedGuId, "5", 

      "0", "Id", "-1"); 

      docStateSpinner.setAdapter(SpinnerStateAdapter); 
      NumberPerPageSpinner.setAdapter(SpinnerNumAdapter); 
      SortBySpinner.setAdapter(SpinnerSortAdapter); 

     } catch (IllegalStateException e) { 

      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

     super.onPostExecute(post); 
    } 

} 
+0

даже прочитать Ответ также включает в себя работу в сети? –

+0

, чтобы прочитать, вы должны получить InputStream от ответа. и данные в поток поступают из сети. поэтому чтение включает в работу сети –

+0

спасибо за информацию, я пробую это. –

1

Попробуйте добавить это ниже код на onCreate(Bundle bundle)

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

//your code 
} 
+0

, что это для меня делает? –

+0

попытайтесь добавить это, это обработает процесс задачи Async. добавьте его и запустите свой код –

+0

@ user406090 это не решение. должен перемещать n/w связанную операцию с потоком. – Raghunandan

0

Когда вы выполняете задачу сетевого подключения, такую ​​как выборка данных с сервера в главной теме, эта проблема возникает. Рекомендуются для выполнения таких задач в doInbackground() методы AsyncTask или вы также можете избежать этой проблемы, поставив код ниже в onCreate() деятельности:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder() 
       .permitAll().build(); 
StrictMode.setThreadPolicy(policy); 

Я надеюсь, что это будет решить вашу проблему, когда вы уже написали много код в главной теме.

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