2016-04-15 55 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可以读取字符串,否则太需要无法移动到背景部分。

相关问题