在 HttpResponse 响应代码中使我的 Android 应用程序崩溃

我正在尝试获取 HttpReponse 的响应代码。我更改了获取响应的方法,但它不起作用。


在我使用这个 try & catch 之前:(url 是函数的参数)


try {

        HttpClient httpclient = new DefaultHttpClient();

        HttpPost method = new HttpPost(url);


        if (params != null) {

            method.setEntity(new UrlEncodedFormEntity(params));

        }


        HttpResponse response = httpclient .execute(method);


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

        String result = convertInputStreamToString(inputStream);


        return result;

    }

    catch (ClientProtocolException e) {

        e.printStackTrace();

    }

    catch (IOException e) {

        e.printStackTrace();

    }


    return null;

}

但是这段代码给了我一个运行时错误HttpResponse response = httpclient .execute(method);


繁花如伊
浏览 145回答 2
2回答

烙印99

这就是谷歌所说的。为避免创建无响应的 UI,请勿在 UI 线程上执行网络操作。默认情况下,Android 3.0(API 级别 11)及更高版本要求您在主 UI 线程以外的线程上执行网络操作;如果不这样做,NetworkOnMainThreadException则会抛出 a。您需要在单独的线程中执行您的 HTTP 请求。这可以在一个AsyncTask.在您的情况下,您需要在下载完成后更新 UI。使用监听器通知 UI 线程public interface ResultsListener {&nbsp; &nbsp; public void onResultsSucceeded(String result);}这是来自 Google 开发人员指南的示例。我对其进行了编辑,并在结果完成后调用了侦听器。&nbsp;private class HttpRequestTask extends AsyncTask<URL, Integer, String> {&nbsp; &nbsp; &nbsp; public void setOnResultsListener(ResultsListener listener) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;this.listener = listener;&nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; protected String doInBackground(URL... urls) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;int count = urls.length;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;for (int i = 0; i < count; i++) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String httpResult = // Do your HTTP requests here&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// Escape early if cancel() is called&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (isCancelled()) break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;return httpResult;&nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp;// use this method if you need to show the progress (eg. in a progress bar in your UI)&nbsp; &nbsp; &nbsp;protected void onProgressUpdate(Integer... progress) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;setProgressPercent(progress[0]);&nbsp; &nbsp; &nbsp;}&nbsp; &nbsp; &nbsp;// this method is called after the download finished.&nbsp; &nbsp; &nbsp;protected void onPostExecute(String result) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;showDialog("Downloaded " + result);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;listener.onResultsSucceded(result);&nbsp; &nbsp; &nbsp;}&nbsp;}new HttpRequestTask().execute(url)现在您可以通过调用Activity来执行任务。您的活动需要实施ResultsListener. 在该onResultsSucceeded方法中,您可以更新您的 UI 元素。你看,你可以在你的例子中很好地使用 AsyncTask。你只需要重新格式化你的代码。

蝴蝶刀刀

我使用 AsyncTask 但不再工作请检查我的代码public class RegisterActivity extends Activity {EditText editusername;EditText editpassword;String&nbsp; &nbsp;username;String&nbsp; &nbsp;password;@Overrideprotected void onCreate(Bundle savedInstanceState) {&nbsp; &nbsp; super.onCreate(savedInstanceState);&nbsp; &nbsp; setContentView(R.layout.register);&nbsp; &nbsp; editusername = (EditText) findViewById(R.id.username_reg);&nbsp; &nbsp; editpassword = (EditText) findViewById(R.id.password_reg);&nbsp; &nbsp; Button reg_btn = (Button) findViewById(R.id.reg_btn);&nbsp; &nbsp; reg_btn.setOnClickListener(new OnClickListener() {&nbsp; &nbsp; &nbsp; &nbsp; @Override&nbsp; &nbsp; &nbsp; &nbsp; public void onClick(View arg0) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; username = editusername.getText().toString();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; password = editpassword.getText().toString();&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; new RegisterAsyncTask().execute();&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; });}class RegisterAsyncTask extends AsyncTask<Void, Void, Boolean> {&nbsp; &nbsp; private void postData(String username, String password) {&nbsp; &nbsp; &nbsp; &nbsp; HttpClient httpclient = new DefaultHttpClient();&nbsp; &nbsp; &nbsp; &nbsp; HttpPost httppost = new HttpPost("myurl");&nbsp; &nbsp; &nbsp; &nbsp; try {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nameValuePairs.add(new BasicNameValuePair("username", username));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nameValuePairs.add(new BasicNameValuePair("password", password));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; nameValuePairs.add(new BasicNameValuePair("action", "insert"));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; HttpResponse response = httpclient.execute(httppost);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; catch (Exception e)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Log.e("log_tag", "Error:&nbsp; " + e.toString());&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; @Override&nbsp; &nbsp; protected Boolean doInBackground(Void... params) {&nbsp; &nbsp; &nbsp; &nbsp; postData(username, password);&nbsp; &nbsp; &nbsp; &nbsp; return null;&nbsp; &nbsp; }}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java