android 4.03中的connectivity_service导致NPE?

时间:2012-08-01 06:45:18

标签: android libgdx

我最近在Android市场上发布了一款游戏,今天通过ACRA获得了我的第一个错误报告。例外是:

java.lang.NullPointerException
at com.sweee.db.AndroidDBHelper.java.util.ArrayList getScores()(SourceFile:65)
at sweee.com.screens.HighScoreScreen.void show()(SourceFile:180)
at com.badlogic.gdx.Game.void setScreen(com.badlogic.gdx.Screen)(SourceFile:59)
at sweee.com.screens.LevelDoneScreen.void render$133aeb()(SourceFile:46)
at com.badlogic.gdx.Game.void render()(SourceFile:46)
at com.sweee.main.SweeeMain.void render()(SourceFile:125)
at com.badlogic.gdx.backends.android.AndroidGraphics.void
onDrawFrame(javax.microedition.khronos.opengles.GL10)(SourceFile:452)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1462)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1216)

通过ACRA我知道该设备是运行ICS 4.03的Acer Iconia A100。我不幸地无法在模拟器上重现错误(尝试连接到互联网和飞机模式)。它声称抛出NPE的行是对我的函数“isConnected()”的调用,它执行此操作:

public boolean isConnected() {
        final ConnectivityManager connectManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);

        // Return true if connected, either in 3G or wi-fi
        final boolean connected = (connectManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED || connectManager.getNetworkInfo(
            ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED);
        return connected;
}

我几乎无能为力,想解决这个问题。此方法是否存在任何常见问题,以检查特定于ICS 4.03或Iconia A100的现有互联网连接?

也许拥有Iconia A100的人可以帮我一个忙,并尝试重现失败?该游戏在Android市场上免费here。非常感谢您的时间和任何可能的答案或提示。

编辑:

@Override
    public ArrayList<Score> getScores() {

    Cursor c = getWritableDatabase().query("scores", null, null, null, null, null, "points DESC");
    if (c.moveToFirst()) {
        do {
            Score s = new Score(c.getString(1), c.getInt(2), getBoolFromInt(c.getInt(3)), getBoolFromInt(c.getInt(4)));
            if (!scores.contains(s)) {
                scores.add(s);
            }
        } while (c.moveToNext());
    }

    if (isConnected()) {

        syncDB();
    }

    return scores;
}

这是导致NPE的功能。第65行将是

if(isConnected()) {

当类获取时,实例化ArrayList分数(应用程序的第一次调用之一,之前不会调用,因此不应该为null)。 既不是对score.contains的召唤也不是添加会导致NPE,对吗? 我只是不明白。特别是这个代码在其他9个设备上正常运行......

我真的很感激你的帮助。谢谢!

2 个答案:

答案 0 :(得分:3)

我最近在Acer Iconia A100中使用isConnect()方法遇到了此问题

我发现的解决方案正在改变isConnect()方法,如下所示,并且效果非常好!

我只是将一个孔代码放入try catch中,当它抛出一个nullPointerException时,我返回true

你可以在这里看到代码:

    public Boolean isConnect() {

    try{
    ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);


    if (cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == etworkInfo.State.CONNECTED
            || cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() ==NetworkInfo.State.CONNECTED) {

        return true;
    } else {
        return false;
    }
    }
    catch(NullPointerException e)
    {
        return true;
    }


}

答案 1 :(得分:1)

我认为错误就在这一行

final boolean connected =
        (connectManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED 
        || connectManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED);

这是因为(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);返回null。

查看documentation。它说 Returns: The service or null if the name does not exist.根据这个,名称Context.CONNECTIVITY_SERVICE不存在。这可能是操作系统实施问题吗?可能。

我有一种“类似”的情况:我想开始一个活动来处理android.provider.Settings.ACTION_DATA_ROAMING_SETTINGS,并且在我的设备上它可以工作(OS 2.3.7),但是在其他一些设备上(OS版本和低于2.3.7)它没有用。这可能是操作系统实施问题吗?最有可能。

由于您无法重现崩溃,

  1. 购买Acer Iconia A100 with ICS 4.03并对其进行测试
  2. 使用一些技巧。我的意思是:
  3. 使用以下代码发布更新,并希望您的Acer Iconia用户更新应用程序:

    public boolean isConnected() {
        final ConnectivityManager connectManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    
        // trickery
        if (connectManager == null) {
            throw new RuntimeException("connectManager is null!");
        }
        // end trickery
    
        // Return true if connected, either in 3G or wi-fi
        final boolean connected =
            (connectManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED 
            || connectManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED);
        return connected;
    }
    

    通过这种方式,您可以获得包含此特定邮件的崩溃报告。这样你就可以得出一些结论。

    无论如何,如果您只想让自己的应用发挥作用,请针对connectManager检查null

    希望这有帮助。

    编辑:

    或者,只需执行以下操作:

    public boolean isConnected() {
        // final ConnectivityManager connectManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    
        final ConnectivityManager connectManager = null;
    
        // Return true if connected, either in 3G or wi-fi
        final boolean connected =
            (connectManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE).getState() == NetworkInfo.State.CONNECTED 
            || connectManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState() == NetworkInfo.State.CONNECTED);
        return connected;
    }
    

    并查看堆栈跟踪是否相同。