当没有网络连接时,安卓应用程序强制终止

3
当没有互联网连接时,我的应用程序无法运行。而当用户在应用程序仍在运行时关闭互联网连接,则应用程序会终止。
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
建议:将所有的 if/else 替换为 switch/case。 - Suvitruf - Andrei Apanasik
3个回答

1
你可以创建一个方法来检查Internet连接是否可用,
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类中执行与网络相关的操作。


1
您可以将此代码放在所有的else if语句中。
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","");
           }

为了正确处理所有可能的异常,您需要上述代码。

此外,由于您有很多带有常量检查的else if语句,将其转换为switch case语句将使代码更易读且运行更快。


0

你的应用程序终止了,因为你没有处理异常。

现在,你可以在打开应用程序后立即检查网络连接,但这不是解决问题的正确方法,因为你可能会在中途失去网络连接,同样的异常会再次发生。

所以,你必须处理异常。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接