Ошибка асинхронной задачи сети - PullRequest
0 голосов
/ 03 ноября 2011

Я создаю приложение для Android, которое использует асинхронную задачу для входа в систему и отправки данных (HTTP Post Request. Приложение работает хорошо, когда интернет-соединение исправно, но при ведении журнала, и для отправки данных требуется слишком много времени из-за медленного соединения, прикладная сила приложения закрывается. Я хотел бы отобразить тост "Ошибка в соединении", когда это произойдет. Пожалуйста, помогите

1 Ответ

0 голосов
/ 05 ноября 2011

Ваше приложение, вероятно, падает, потому что вы пытаетесь показать Toast не в потоке пользовательского интерфейса.То есть вы всегда должны вносить любые изменения в пользовательский интерфейс с помощью Handler или в методе onPostExecute (), который также выполняется в потоке пользовательского интерфейса.

Как перехватывать исключения в потоке doInBackground и представлять их в потоке пользовательского интерфейса - это еще один вопрос, я могу предложить вам следующее решение:

private class LoginTask extends
        AsyncTask<Void, Integer, JSONArray[]> {

    private static final int NETWORK_NO_ERROR = -1;
    private static final int NETWORK_HOST_UNREACHABLE = 1;
    private static final int NETWORK_NO_ACCESS_TO_INTERNET = 2;
    private static final int NETWORK_TIME_OUT = 3;
            // You can continue this list...

    Integer serverError = NETWORK_NO_ERROR; 

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog.show(); // Don't forget to create it before

    }

    @Override
    protected JSONArray[] doInBackground(Void... v) {
        JSONArray[] result = null;
        try {
            result = NetworkManager.login(/* All params you need */);
        } catch (JSONException e) { 
            return null;
        } catch (ConnectException e) {
            serverError = NETWORK_NO_ACCESS_TO_INTERNET;
            return null;
        } catch (UnknownHostException e) {
            serverError = NETWORK_HOST_UNREACHABLE;
            return null;
        } catch (SocketTimeoutException e) {
            serverError = NETWORK_TIME_OUT;
            return null;
        } catch (URISyntaxException e) {
            // ..
            return null;
        } catch (ClientProtocolException e) {
            // ..
            return null;
        } catch (Exception e) {
            // ..
            return null;
        }

        return result;
    }

    @Override
    protected void onPostExecute(JSONArray[] result) {
                    progressDialog.dismiss();
                if (result != null) {
                    processAndShowResult(result);
                } else {
                       switch (serverError) {
                           case NETWORK_NO_ERROR:
                   Toast.makeText(YourActivity.this, "Probably, invalid response from server", Toast.LENGTH_LONG).show();
                              break;
                           case NETWORK_NO_ACCESS_TO_INTERNET:
                               // You can customize error message (or behavior) for different type of error
                           case NETWORK_TIME_OUT:
                           case NETWORK_HOST_UNREACHABLE: 
                   Toast.makeText(YourActivity.this, "Error in Connection", Toast.LENGTH_LONG).show();
                              break;
                       }

                }
    }
}

Таким образом, вы можете гибко контролировать сетевые ошибки ипредпринять соответствующие действия, согласно этим ошибкам.

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