Android HttpPost会导致应用崩溃

时间:2015-09-03 21:53:17

标签: java android

我正在尝试通过android studio中的java发送帖子请求到我的PHP页面

我在eclipse中尝试了相同的代码,但同样的问题显示,应用程序停止工作。

我在清单中放了互联网许可。

我的代码:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView txt=(TextView) findViewById(R.id.textView1);
        String mail="aa@gmail.com",pass="pass";
        HttpClient httpClient = new DefaultHttpClient();
        HttpPost httpPost = new HttpPost("http://10.0.2.2:8888/LoginTest/login.php");

        try {
        List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(1);
        nameValuePair.add(new BasicNameValuePair("mail", mail));
        nameValuePair.add(new BasicNameValuePair("pass", pass));
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
        HttpResponse response=  httpClient.execute(httpPost);

        InputStream is= response.getEntity().getContent();

        BufferedReader br=new BufferedReader(new InputStreamReader(is));
        StringBuilder sb=new StringBuilder();
        String line=null;

        while ((line = br.readLine()) != null) {
            sb.append(line + "\n");
        }
        txt.setText(sb.toString());
        br.close();

        }
          catch (ClientProtocolException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

我的LogCat:https://www.dropbox.com/s/smhyoxdob66czr7/testLogCat.txt?dl=0

1 个答案:

答案 0 :(得分:2)

最有可能的是,您的应用程序因异常而崩溃,即android.os.NetworkOnMainThreadException

当您尝试执行冗长的耗时任务(如网络请求和在主线程上下载响应)时会引发此异常,就像您在onCreate()中所做的那样。 Android并不喜欢它。它使它保持冻结/无响应,这使它生气并且它会杀死你的应用程序。

使用AsyncTask的解决方案。这个想法是在后台线程而不是主线程中完成冗长的任务。如下:

//this should be inside your Activity class
private class NetworkRequestTask extends AsyncTask<Void, Void, String>{

    @Override
    protected String doInBackground(Void... params) {
        // your network code here
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        // set the result to your label
    }

}

并从你的onCreate()调用此任务如下:

new NetworkRequestTask(). execute();

它会让android变得快乐和敏感。它会让您的应用运行并且不会杀死它。