I don't know how to solve (android.os.networkonmainthreadexception)

I always get this error

public class FlightAvailabityGoActivity extends ListActivity { String[] monthName = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; date userDate=new date(); int DepDay=userDate.getDays(); int DepMonth=userDate.getMonths(); bean beanz=new bean(); private TextView fromToTextView; Calendar calendar = new GregorianCalendar(); String am_pm; String TAG="from"; private TextView from,to; languages lang=new languages(); String En_Ar=lang.getLang(); Element dest; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { try{ Log.v(TAG, "in go activity " +TAG); super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_CUSTOM_TITLE); setContentView(R.layout.listplaceholder_flightavailabity); if(En_Ar.equals("arabic")) { getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.window_title_flightavailabity_ar); // from=(TextView)findViewById(R.id.fromText); // from.setText(" Ω…Ω† "); // to=(TextView)findViewById(R.id.toText); //to.setText(" Ψ₯Ω„Ω‰ "); Log.v(TAG, "1 " +TAG); } else { Log.v(TAG, "1 " +TAG); getWindow().setFeatureInt(Window.FEATURE_CUSTOM_TITLE, R.layout.window_title_flightavailabity); } //// Bundle extras = getIntent().getExtras(); String FromCity = extras.getString("from"); String ToCity = extras.getString("to"); Log.v(TAG, "from city after moving " +FromCity); Log.v(TAG, "to city after moving " +ToCity); ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>(); ArrayList<HashMap<String, String>> mylist1 = new ArrayList<HashMap<String, String>>(); Log.v(TAG, "2 " +TAG); //String xml = XMLfunctions.getXMLFlightAva(FromCity,ToCity); String xml=XMLfunctions.getXMLFlightAva(FromCity,ToCity); // error is here Log.v(TAG, "3 " +TAG); // this will not display xml=xml.trim(); Log.v(TAG, "4 " +TAG); 

I am redder about this and I understand it about using the Internet, but I don’t know how to solve it? as you can see, I read XML over HTTP, get XML functions in my class, and it returns the XML in the line here where every thing crashed

Do I need to change the class in String xml = XMLfunctions.getXMLFlightInfo (FromCity);

its the same method as

  String xml=XMLfunctions.getXMLFlightAva(FromCity,ToCity); 

this is class

  public class XMLfunctions { String TAG; public final static Document XMLfromString(String xml){ Document doc = null; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); try { DocumentBuilder db = dbf.newDocumentBuilder(); InputSource is = new InputSource(); is.setCharacterStream(new StringReader(xml)); doc = db.parse(is); } catch (ParserConfigurationException e) { System.out.println("XML parse error: " + e.getMessage()); return null; } catch (SAXException e) { System.out.println("Wrong XML file structure: " + e.getMessage()); return null; } catch (IOException e) { System.out.println("I/O exeption: " + e.getMessage()); return null; } return doc; } /** Returns element value * @param elem element (it is XML tag) * @return Element value otherwise empty String */ public final static String getElementValue( Node elem ) { Node kid; if( elem != null){ if (elem.hasChildNodes()){ for( kid = elem.getFirstChild(); kid != null; kid = kid.getNextSibling() ){ if( kid.getNodeType() == Node.TEXT_NODE ){ return kid.getNodeValue(); } } } } return ""; } //////////////////////// public static String getXMLFlightInfo(String Y_or_T){ String line = null; String TAG="TAG"; date userDate=new date(); int DepDay=userDate.getDays(); int DepMonth=userDate.getMonths(); try { DefaultHttpClient httpClient = new DefaultHttpClient(); // HttpPost httpPost = new HttpPost("http://p-xr.com/xml"); //HttpGet httpPost=new HttpGet("http://10.128.11.206:9080/mobile/FlightSchdIphoneServlet?depCity="+fromCity+"&arrCity="+toCity+"&day="+DepDay+"&month="+DepMonth+""); //HttpGet httpPost=new HttpGet("http://mysv.net.sa/Web/mobile/FlightAvailIphoneServlet?depCity=JED&arrCity=RUH&day=29&month=11&submit=+GO+"); HttpGet httpPost=new HttpGet("http://10.131.13.43:9080/onlineSMS/xmlFlightInfo.html"); HttpResponse httpResponse = httpClient.execute(httpPost); HttpEntity httpEntity = httpResponse.getEntity(); line = EntityUtils.toString(httpEntity); } catch (UnsupportedEncodingException e) { line = "<array status=\"error\"><msg>Can't connect to server</msg></array>"; } catch (MalformedURLException e) { line = "<array status=\"error\"><msg>Can't connect to server</msg></array>"; } catch (IOException e) { line = "<array status=\"error\"><msg>Can't connect to server</msg></array>"; } return line; } 
+2
source share
1 answer

StrictMode.ThreadPolicy was introduced from API level 9, and the default behavior was changed in API 11, which, in short, does not allow (including HttpClient and HttpUrlConnection) to be executed in the user interface thread.

The correct strategy is to switch the network from the user interface stream, for example, using AsyncTask .

hope this help.

+3
source

Source: https://habr.com/ru/post/1434796/


All Articles