Как избежать принудительного закрытия приложения в Android

#android #exception #mobile

#Android #исключение #Мобильный

Вопрос:

Я пытался найти решение в Интернете, к сожалению, я не смог найти ответ. Я попытался использовать try catch, чтобы поймать исключение ошибки, но все равно это не сработает. Вот мой код. У меня есть частный класс LoginTask

 private class LoginTask extends AsyncTask<String,String,JSONObject> {


    private String[] privateCredentials;
    private String privateRequest;
    private String errorMessage = "";
    //initialize all here
    //constructor
    LoginTask(String[] credentials,String request) {
        this.privateRequest = request;
        this.privateCredentials = credentials;


    }

    @Override
    protected void onPostExecute(JSONObject result) {
        super.onPostExecute(result);

        if(this.privateRequest=="login"){
            try {
                String response = result.getString("status");

                if(response.equals("ok")){
                    onLoginSuccess(result.getString("username"),result.getString("full_name"),result.getInt("user_id"));

                }else{
                    onLoginFails();
                }

            } catch (JSONException e) {
                if(errorMessage!=""){
                    Toast ts;
                    ts = Toast.makeText(LoginActivity.this,errorMessage,Toast.LENGTH_LONG);
                    ts.show();
                }
                //e.printStackTrace();
            }
        }


    }




    @Override
    protected JSONObject doInBackground(String... params) {

        String result = "";
        JSONObject resultObj = null;
        HttpURLConnection con = null;
        BufferedReader br = null;
        JSONObject cred = new JSONObject();

        if(this.privateRequest=="login"){

            try {

                cred.put("username", this.privateCredentials[0]);
                cred.put("password", this.privateCredentials[1]);

                URL url = new URL(params[0]);


                con = (HttpURLConnection) url.openConnection();
                ;
                con.setDoOutput(true);
                con.setDoInput(true);
                con.setRequestProperty("Content-Type", "application/json");
                con.setRequestProperty("Accept", "application/json");
                con.setRequestMethod("POST");
                con.connect();
                OutputStream outputStream = con.getOutputStream();
                outputStream.write(cred.toString().getBytes());
                InputStream stream = con.getInputStream();
                br = new BufferedReader(new InputStreamReader(stream));
                StringBuffer buffer = new StringBuffer();
                String line = "";
                while ((line = br.readLine()) != null) {
                    buffer.append(line);
                }

                //get the result
                JSONObject jsonObj = new JSONObject(buffer.toString());
                resultObj = jsonObj;

                // return buffer.toString();


            }catch (JSONException e) {
                errorMessage = e.getMessage();
                final String error = e.getMessage();

                //e.printStackTrace();
                runOnUiThread(new Runnable(){
                    public void run() {
                        //ErrorDialog(e.getMessage());
                        Toast ts;
                        ts = Toast.makeText(LoginActivity.this,error,Toast.LENGTH_LONG);
                        ts.show();
                    }
                });
            } catch (ProtocolException e) {
               errorMessage = e.getMessage();
                final String error = e.getMessage();

                //e.printStackTrace();
                runOnUiThread(new Runnable(){
                    public void run() {
                        //ErrorDialog(e.getMessage());
                        Toast ts;
                        ts = Toast.makeText(LoginActivity.this,error,Toast.LENGTH_LONG);
                        ts.show();
                    }
                });

                //e.printStackTrace();

            } catch (IOException e) {
               errorMessage = e.getMessage();
                final String error = e.getMessage();

                //e.printStackTrace();
                runOnUiThread(new Runnable(){
                    public void run() {
                        //ErrorDialog(e.getMessage());
                        Toast ts;
                        ts = Toast.makeText(LoginActivity.this,error,Toast.LENGTH_LONG);
                        ts.show();
                    }
                });

                //e.printStackTrace();

            } finally {

                if(con!=null) {
                    con.disconnect();
                }

            }

            return resultObj;
        }

        return null;
    }
}
  

И вот мой код прослушивателя событий в операции входа в систему.

 //when clicking the login button
    loginBtn.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {

            //do now the login process
            userText.setVisibility(view.INVISIBLE);
            passwordText.setVisibility(view.INVISIBLE);
            tvRegister.setVisibility(view.INVISIBLE);
            umlogo.setVisibility(view.INVISIBLE);


            //set textviews to invisible
           /* tv[0].setVisibility(view.INVISIBLE);
            tv[1].setVisibility(view.INVISIBLE);*/

            //set also the button to invisible
            loginBtn.setVisibility(view.INVISIBLE);


            //set visible the progress bar
            pb.setVisibility(view.VISIBLE);

            //set now the user login credentials
            credentials[0] = userText.getText().toString();
            credentials[1] = passwordText.getText().toString();
            loginTask = new LoginTask(credentials,"login");
            //loginTask.execute("http://10.0.2.2/sampleRequest.php");
            //loginTask.execute("http://10.0.2.2/motorpool_june_2016_laravel/public/mobile/login");


            loginTask.execute("http://128.199.105.49/mobile/login");

            //SessionHolder.login(credentials, la);

        }
    });
  

Однако он по-прежнему не работает. Пожалуйста, помогите. 🙁

Комментарии:

1. И ошибка есть ?!

2. Это принудительно закроет приложение. Я пытаюсь перехватить ошибки, чтобы избежать принудительного закрытия приложения… Я ожидаю увидеть всплывающее сообщение, но я получаю только принудительное закрытие… Пожалуйста, помогите

3. Опять же, какова трассировка стека сбоя?

4. К сожалению, я не использую AVD, а вместо этого автоматически генерирую APK и пробую его с помощью Bluestack…

Ответ №1:

Вы не можете сравнивать String s с == java. Вы должны написать это, как показано ниже:

 if(this.privateRequest.equals("login")){
  

== тесты на равенство ссылок (являются ли они одним и тем же объектом)

Комментарии:

1. Нет… Это не моя проблема.. Я могу войти в систему, если есть Интернет, так что это не проблема.. Проблема в том, что если интернета нет, это принудительно закроет приложение, и это то, чего я пытаюсь избежать.

2. Добавьте журнал logcat в свой вопрос.

3. К сожалению, я не использую AVD.. Когда я тестирую приложение, я просто создаю APK, а затем устанавливаю его с помощью Bluestack….

4. почему? таким образом, вы не сможете ничего отлаживать. используйте устройство Android и его журнал в logcat. вы не можете устранить свои ошибки без журнала

5. ЭТО потому, что есть проблема с AVD… Хорошо, я попробую еще раз с помощью AVD и logcat, чтобы увидеть исключение ошибки.