在后退键上获得强制关闭错误

时间:2014-01-24 23:48:11

标签: java android

当我按下后退键离开此网站的游戏时,我遇到了问题。我在后退键上收到强制错误消息。我使用了从第一个问题中学到的破坏代码。没有改变什么。有什么想法吗?

public class MainActivity extends Activity {

WebView myWebView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    WebView myWebView = (WebView) findViewById(R.id.webView1);
    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);

    myWebView.getSettings().setDomStorageEnabled(true);
    myWebView.getSettings().setJavaScriptEnabled(true);

    myWebView.loadUrl("http://www.limejs.com/static/roundball/index.html");

}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // Check if the key event was the Back button and if there's history
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
        myWebView.goBack();
        finish();
        return true;
    }
    // If it wasn't the Back key or there's no web page history, bubble up
    // to the default
    // system behavior (probably exit the activity)
    return super.onKeyDown(keyCode, event);
}

@Override
public void onDestroy() {
    super.onDestroy();
    myWebView.destroy();
}

}

Here is the Logcat:

FATAL EXCEPTION: main
java.lang.NullPointerException
at com.example.roundball.MainActivity.onKeyDown(MainActivity.java:33)
at android.view.KeyEvent.dispatch(KeyEvent.java:1256)
at android.app.Activity.dispatchKeyEvent(Activity.java:2078)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent
(PhoneWindow.java:1771)
at android.view.ViewRoot.deliverKeyEventToViewHierarchy(ViewRoot.java:2563)
at android.view.ViewRoot.handleFinishedEvent(ViewRoot.java:2538)
at android.view.ViewRoot.handleMessage(ViewRoot.java:1870)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:130)
at android.app.ActivityThread.main(ActivityThread.java:3683)`enter code here`
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:507)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:891)
at dalvik.system.NativeStart.main(Native Method)

I have used this code before to load web sites, it is just particular to this game?

4 个答案:

答案 0 :(得分:1)

我会删除返回true;就在结束后();

如果你有一些adb日志来显示你得到的确切错误会有所帮助。

您还可以检查myWebView是否为空。我想也可能是空的。

答案 1 :(得分:1)

你的日志说:

  

java.lang.NullPointerException at   com.example.roundball.MainActivity.onKeyDown(MainActivity.java:33)

这意味着在执行时onKeyDown方法内的代码中存在空引用。你只使用2个引用,但由于它不太可能你收到一个空的KeyEvent(它来自Android运行时和文档隐含地说你总是在调用onKeyDown时收到一个有效的引用),它必须是你的webview的引用。因此,在调用myWebView方法之前,请检查myWebView!= null,如下所示。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // Check if the key event was the Back button and if there's history
    if(myWebView != null) {
        if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
            myWebView.goBack();
            finish();
            return true;
        }
    } else {
        android.util.Log.w("MyActivity", "myWebView is null!!");
    }
    // If it wasn't the Back key or there's no web page history, bubble up
    // to the default
    // system behavior (probably exit the activity)
    return super.onKeyDown(keyCode, event);
} 

根据该代码,我无法告诉您导致您对webview具有空引用的原因,但如果您希望您的webview引用不为null,它可能会告诉您下一步该问题的位置。< / p>

答案 2 :(得分:0)

将您的代码更改为下面给出的代码..基本上..我将您的调用更新为完成()到MainActivity.this.finish(),其中MainActivity是您的活动!因此,您必须将MainActivity更改为您提供的任何名称。

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    // Check if the key event was the Back button and if there's history
    if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
        myWebView.goBack();
        MainActivity.this.finish();
        return true;
    }
    // If it wasn't the Back key or there's no web page history, bubble up
    // to the default
    // system behavior (probably exit the activity)
    return super.onKeyDown(keyCode, event);
}

答案 3 :(得分:0)

//replace for this   

 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        // Check if the key event was the Back button and if there's history
        if ((keyCode == KeyEvent.KEYCODE_BACK) && myWebView.canGoBack()) {
            myWebView.goBack();
            return true;
        }
                if (keyCode != KeyEvent.KEYCODE_BACK){
                    return MainActivity.onKeyDown(keyCode, event);
                }else{
                    myWebView.destroy();
                    MainActivity.finish();
                    return false;
                }
    }