Сбой моего приложения для Android в HttpResponse Код ответа - PullRequest
0 голосов
/ 04 февраля 2019

Я пытаюсь получить код ответа для 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);

Поэтому я изменил свой код:

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());
    }
}}

Пожалуйста, помогите мне с этим кодом, чтобы решить мою проблему.

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Я использую 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;
    }
}}
0 голосов
/ 04 февраля 2019

Это то, что Google говорит.

Чтобы избежать создания неотвечающего пользовательского интерфейса, не выполняйте сетевые операции в потоке пользовательского интерфейса.По умолчанию Android 3.0 (уровень API 11) и выше требует выполнения сетевых операций с потоком, отличным от основного потока пользовательского интерфейса;в противном случае выдается NetworkOnMainThreadException.

Вам необходимо выполнять HTTP-запросы в отдельном потоке.Это можно сделать в AsyncTask.

. В вашем случае вам необходимо обновить интерфейс после завершения загрузки.Используйте прослушиватель, чтобы уведомить пользовательский интерфейс

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);
     }
 }

Теперь вы можете выполнить задачу, вызвав new HttpRequestTask().execute(url) в своей деятельности.Ваша деятельность должна реализовать ResultsListener.Внутри метода onResultsSucceeded вы можете обновить элементы вашего интерфейса.

Видите ли, вы можете использовать AsyncTask в своем примере очень хорошо.Вам просто нужно переформатировать код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...