繁体   English   中英

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

[英]Crash my Android app in HttpResponse response Code

我正在尝试获取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);给了我一个运行时错误HttpResponse response = httpclient .execute(method);

所以我更改了代码:

public class RegisterActivity extends Activity {

String      username;
String      password;
InputStream is     = null;
String      result = null;
String      line   = null;
int         code;


@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.register);
    final EditText usernamefield = (EditText) findViewById(R.id.username_reg);
    final EditText passwordfield = (EditText) findViewById(R.id.password_reg);
    Button reg_btn = (Button) findViewById(R.id.reg_btn);
    reg_btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            username = usernamefield.getText().toString();
            password = passwordfield.getText().toString();
            insert();
            ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("username", usernamefield.getText().toString()));
            params.add(new BasicNameValuePair("password", passwordfield.getText().toString()));
            params.add(new BasicNameValuePair("action", "insert"));

        }
    });

}


public void insert()
{
    ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
    nameValuePairs.add(new BasicNameValuePair("username", username));
    nameValuePairs.add(new BasicNameValuePair("password", password));
    nameValuePairs.add(new BasicNameValuePair("action", "insert"));

    try
    {
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://192.168.1.10/ferdos/service.php");
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = httpclient.execute(httppost);
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
        Log.e("pass 1", "connection success ");
    }
    catch (Exception e)
    {
        Log.e("Fail 1", e.toString());
        Toast.makeText(getApplicationContext(), "Invalid IP Address",
                Toast.LENGTH_LONG).show();
    }

    try
    {
        BufferedReader reader = new BufferedReader
                (new InputStreamReader(is, "iso-8859-1"), 8);
        StringBuilder sb = new StringBuilder();
        while ((line = reader.readLine()) != null)
        {
            sb.append(line + "\n");
        }
        is.close();
        result = sb.toString();
        Log.e("pass 2", "connection success ");
    }
    catch (Exception e)
    {
        Log.e("Fail 2", e.toString());
    }

    try
    {
        JSONObject json_data = new JSONObject(result);
        code = (json_data.getInt("code"));

        if (code == 1)
        {
            Toast.makeText(getBaseContext(), "Inserted Successfully",
                    Toast.LENGTH_SHORT).show();
        }
        else
        {
            Toast.makeText(getBaseContext(), "Sorry, Try Again",
                    Toast.LENGTH_LONG).show();
        }
    }
    catch (Exception e)
    {
        Log.e("Fail 3", e.toString());
    }
}}

请帮助我使用此代码来解决我的问题。

那就是谷歌所说的。

为避免创建无响应的UI,请不要在UI线程上执行网络操作。 默认情况下,Android 3.0(API级别11)及更高版本要求您在除主UI线程之外的其他线程上执行网络操作; 如果不这样做,则会引发NetworkOnMainThreadException

您需要在单独的线程中执行HTTP请求。 这可以在AsyncTask.完成AsyncTask.

根据您的情况,您需要在下载完成后更新UI。 使用侦听器通知UI线程

public interface ResultsListener {
    public void onResultsSucceeded(String result);
}

这是 Google开发人员指南中的示例 我对其进行了编辑,结果完成后它将调用侦听器。

 private class HttpRequestTask extends AsyncTask<URL, Integer, String> {

      public void setOnResultsListener(ResultsListener listener) {
           this.listener = listener;
      }

      protected String doInBackground(URL... urls) {
         int count = urls.length;
         for (int i = 0; i < count; i++) {
             String httpResult = // Do your HTTP requests here
             // Escape early if cancel() is called
             if (isCancelled()) break;
         }
         return httpResult;
     }

     // use this method if you need to show the progress (eg. in a progress bar in your UI)
     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }
     // this method is called after the download finished.
     protected void onPostExecute(String result) {
         showDialog("Downloaded " + result);
         listener.onResultsSucceded(result);
     }
 }

现在,您可以通过在Activity中调用new HttpRequestTask().execute(url)来执行任务。 您的活动需要实现ResultsListener onResultsSucceeded方法内部,您可以更新UI元素。

您会看到,可以很好地在示例中使用AsyncTask。 您只需要重新格式化代码即可。

我使用AsyncTask,但无法再次使用,请检查我的代码

public class RegisterActivity extends Activity {

EditText editusername;
EditText editpassword;
String   username;
String   password;


@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.register);
    editusername = (EditText) findViewById(R.id.username_reg);
    editpassword = (EditText) findViewById(R.id.password_reg);

    Button reg_btn = (Button) findViewById(R.id.reg_btn);
    reg_btn.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            username = editusername.getText().toString();
            password = editpassword.getText().toString();
            new RegisterAsyncTask().execute();
        }
    });
}


class RegisterAsyncTask extends AsyncTask<Void, Void, Boolean> {

    private void postData(String username, String password) {

        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("myurl");

        try {
            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(3);
            nameValuePairs.add(new BasicNameValuePair("username", username));
            nameValuePairs.add(new BasicNameValuePair("password", password));
            nameValuePairs.add(new BasicNameValuePair("action", "insert"));

            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost);
        }
        catch (Exception e)
        {
            Log.e("log_tag", "Error:  " + e.toString());
        }
    }


    @Override
    protected Boolean doInBackground(Void... params) {
        postData(username, password);
        return null;
    }
}}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM