Приложение Android принудительно завершает работу при отсутствии подключения к Интернету

Когда нет подключения к Интернету, мое приложение не запускается, и когда пользователь закрывает подключение к Интернету, пока приложение все еще работает, оно закрывается.

protected void onHandleIntent(Intent intent)
{

    Log.d(Constants.TAG, "Service started");

    List<RssItem> rssItems = null ;
    try {
        PcWorldRssParser parser = new PcWorldRssParser();
        if(flag == 0) {
            rssItems = parser.parse(getInputStream(RSS_LINK));
        }
        else if(flag == 2){
            rssItems = parser.parse(getInputStream(RSS_LINK2));
        }
        else if(flag == 3){
            rssItems = parser.parse(getInputStream(RSS_LINK3));
        }
        else if(flag == 4){
            rssItems = parser.parse(getInputStream(RSS_LINK4));
        }
        else if(flag == 5){
            rssItems = parser.parse(getInputStream(RSS_LINK5));
        }
        else if(flag == 6){
            rssItems = parser.parse(getInputStream(RSS_LINK6));
        }
        else if(flag == 7){
            rssItems = parser.parse(getInputStream(RSS_LINK7));
        }
        else if(flag == 8){
            rssItems = parser.parse(getInputStream(RSS_LINK8));
        }
        else if(flag == 9){
            rssItems = parser.parse(getInputStream(RSS_LINK9));
        }
    } catch (XmlPullParserException e) {
        Log.w(e.getMessage(), e);
    } catch (IOException e) {
        Log.w(e.getMessage(), e);
    }
    Bundle bundle = new Bundle();
    bundle.putSerializable(ITEMS, (Serializable) rssItems);
    ResultReceiver receiver = intent.getParcelableExtra(RECEIVER);
    receiver.send(0, bundle);
}

Класс RssParser:

public List<RssItem> parse(InputStream inputStream) throws XmlPullParserException, IOException {
    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(inputStream, null);
        parser.nextTag();
        return readFeed(parser);

    } finally {

         inputStream.close();

    }
}

В этих двух методах я получаю NullPointerException в:

inputStream.close();
rssItems = parser.parse(getInputStream(RSS_LINK));

3 ответа

Решение

Вы можете поместить это во все ваши else ifs

try {
               rssItems = parser.parse(getInputStream(RSS_LINK));
           }catch (XmlPullParserException e){
               throw new RuntimeException("Error"+ e.getMessage());
           }catch (IOException e){
               throw new RuntimeException("Error"+ e.getMessage());
           }catch (NullPointerException e){
               Log.d("Error in RSS_LINK","");
           }

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

Также вы должны изменить свой if else if код для switch case так как у вас есть много else ifs с постоянными проверками было бы проще читать и быстрее запускать, если вы преобразуете их в switch case

Вы можете создать метод, чтобы проверить, доступно ли подключение к Интернету,

private boolean isNetworkAvailable() {
    ConnectivityManager manager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo networkInfo = manager.getActiveNetworkInfo();

    boolean isAvailable = false;
    if (networkInfo != null && networkInfo.isConnected()) {
        isAvailable = true;
    }
    return isAvailable;
}

Если интернет доступен,

if (isNetworkAvailable()) {
            // Do your stuff here.
        }
else {
}

Совет: выполните сетевую операцию в классе AsycnTask.

Ваше приложение закрывается, потому что вы не обрабатываете исключение.

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

Итак, вы должны обработать исключение.

Другие вопросы по тегам