2016-04-15 57 views
0

我在某個時候收到了NetworkonMainThreadException。我不知道是什麼問題。第一次打開時沒有錯誤,但幾次關閉和打開後會導致NetworkOnMainThreadException。有時在AsyncTask中networkonmainthreadexception

下面是我的MainActivity

public class MainActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    new DownloadWebpageTask().execute(); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 
    return true; 
} 

private class DownloadWebpageTask extends AsyncTask<String, Void, String> { 

    List<Member> members = new ArrayList<Member>(); 
    ListView listView = (ListView) findViewById(R.id.listView1); 
    String ss = ""; 
    InputStream is; 
    HttpURLConnection connection ; 

    @Override 
    protected String doInBackground(String... urls) { 

     try { 

      URL url = new URL("http://192.168.1.107:8080/SEWS_webservice/rest/members"); 
      connection = (HttpURLConnection) url.openConnection(); 
      is = connection.getInputStream(); 
     } catch (IOException e) { 
      System.out.println(e+"***********************&&&&&&&&&&&&&"); 
     }finally { 
      connection.disconnect(); 
     } 

     return ss; 
    } 

    // onPostExecute displays the results of the AsyncTask. 
    @Override 
    protected void onPostExecute(String result) { 

     XmlPullParserHandler parser = new XmlPullParserHandler();   
     parser.parse(is); 
     members = parser.getMembers(); 
     ArrayAdapter<Member> adapter = new ArrayAdapter<Member>(getApplicationContext(),android.R.layout.simple_list_item_1, members); 
     listView.setAdapter(adapter); 

    } 
} 

}

這是XMLPullParser處理

public class XmlPullParserHandler { 
    private List<Member> members= new ArrayList<Member>(); 
    private Member member; 
    private String text; 

    public List<Member> getMembers() { 
     return members; 
    } 

    public List<Member> parse(InputStream is) { 

      try { 
      XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
      factory.setNamespaceAware(true); 
      XmlPullParser parser = factory.newPullParser(); 

      parser.setInput(is, null); 

      int eventType = parser.getEventType(); 

      while (eventType != XmlPullParser.END_DOCUMENT) { 
       String tagname = parser.getName(); 
       switch (eventType) { 
       case XmlPullParser.START_TAG: 
        if (tagname.equalsIgnoreCase("member")) { 
         // create a new instance of employee 
         member = new Member(); 
        } 
        break; 

       case XmlPullParser.TEXT: 
        text = parser.getText(); 
        break; 

       case XmlPullParser.END_TAG: 
        if (tagname.equalsIgnoreCase("member")) { 
         // add employee object to list 
         members.add(member); 
        }else if (tagname.equalsIgnoreCase("memberId")) { 
         member.setMemberId(Integer.parseInt(text)); 
        } 
        else if (tagname.equalsIgnoreCase("firstName")) { 
         member.setFirstName(text); 
        } 
        else if (tagname.equalsIgnoreCase("middleName")) { 
         member.setMiddleName(text); 
        }       
        else if (tagname.equalsIgnoreCase("lastName")) { 
         member.setLastName(text); 
        }       

        break; 
       default: 
        break; 
       } 
       eventType = parser.next(); 
      } 

     } catch (XmlPullParserException e) {e.printStackTrace();} 
     catch (IOException e) {e.printStackTrace();} 
     return members; 
    } 
} 
+1

請添加堆棧跟蹤例外 –

+0

夥計,請選擇幫助你的答案。 –

回答

0

好像XmlPullParser沒有按」 t喜歡在UI線程:)
我找不到這個確切的證明,但即使official example使它在AsyncTask工作。

你的情況,只是嘗試移動下一行:

XmlPullParserHandler parser = new XmlPullParserHandler();   
parser.parse(is); 
members = parser.getMembers(); 

doInBackground()方法和檢查結果。


PS。與問題無關,但String ss = "";的目的是什麼?
如果您不想返回任何內容,您可以將AsyncTask<String, Void, String>更改爲AsyncTask<String, Void, Void>
或者更好的方法 - 你可以這樣做AsyncTask<String, Void, List<Member>>
然後,您製作protected void onPostExecute(List<Member> result)並在您的Adapter代碼中使用此result

+0

thanx它的工作 –

+0

很高興在這裏。如果是這樣,請將答案標記爲正確。如果你願意,你也可以贊成它。謝謝。 –

1

問題是即使您正在使用InputStream從底層套接字讀取的背景中正確連接到網站。您需要重構您的解決方案,以便從doInBackground的結果中返回InputStream中的字符串或原始數據並關閉任何http連接。喜歡的東西

@覆蓋 保護字符串doInBackground(字符串的URL ...){

try { 

     URL url = new URL("http://192.168.1.107:8080/SEWS_webservice/rest/members"); 
     connection = (HttpURLConnection) url.openConnection(); 
     is = connection.getInputStream(); 

     ByteArrayOutputStream oStream = new ByteArrayOutputStream(); 
     byte[] buffer = new byte[2048]; 
     int numRead = -1; 
     while ((numRead = (is.read(buffer))) > -1) { 
      oStream.write(buffer, 0, numRead); 
     } 
     return new String(oStream.getBytes(), "UTF-8"); 
    } catch (IOException e) { 
     System.out.println(e+"***********************&&&&&&&&&&&&&"); 
    }finally { 
     connection.disconnect(); 
    } 

    return ss; 
} 

// onPostExecute displays the results of the AsyncTask. 
@Override 
protected void onPostExecute(String result) { 

    XmlPullParserHandler parser = new XmlPullParserHandler();   
    parser.parse(result); 
    members = parser.getMembers(); 
    ArrayAdapter<Member> adapter = new ArrayAdapter<Member>(getApplicationContext(),android.R.layout.simple_list_item_1, members); 
    listView.setAdapter(adapter); 

} 

應該這樣做,如果XmlPullParserHandler可以讀取字符串,否則太需要無法移動到背景部分。

相關問題