Android - 无法执行活动的方法

时间:2015-02-21 16:04:54

标签: android

我有一个带广播接收器的服务库。

我在主应用程序中所做的就是调用服务中的某些方法,没有什么新的。

每次我想运行我的代码时,我都会收到以下内容(请看下面的内容)

错误

02-21 15:51:26.721  31125-31125/com.haswell.phoneduplicator E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.haswell.phoneduplicator, PID: 31125
java.lang.IllegalStateException: Could not execute method of the activity
        at android.view.View$1.onClick(View.java:3969)
        at android.view.View.performClick(View.java:4633)
        at android.view.View$PerformClick.run(View.java:19330)
        at android.os.Handler.handleCallback(Handler.java:733)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:157)
        at android.app.ActivityThread.main(ActivityThread.java:5356)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
        at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:515)
        at android.view.View$1.onClick(View.java:3964)
            at android.view.View.performClick(View.java:4633)
            at android.view.View$PerformClick.run(View.java:19330)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.lang.NullPointerException
        at android.content.ContextWrapper.getResources(ContextWrapper.java:94)
        at android.widget.Toast.<init>(Toast.java:114)
        at android.widget.Toast.makeText(Toast.java:272)
        at com.haswell.wifidirectlibrary.wifiDirectService.toastme(wifiDirectService.java:99)
        at com.haswell.wifidirectlibrary.wifiDirectService.peerSearch(wifiDirectService.java:151)
        at com.haswell.phoneduplicator.sendActivity.authenticateClick(sendActivity.java:52)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at android.view.View$1.onClick(View.java:3964)
            at android.view.View.performClick(View.java:4633)
            at android.view.View$PerformClick.run(View.java:19330)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:157)
            at android.app.ActivityThread.main(ActivityThread.java:5356)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
            at dalvik.system.NativeStart.main(Native Method)

该服务 - 请注意下面这是更多无效的代码

public void checkWifi(){

    toastme("reached peerSearch");
//check if wifi is on

//ERROR HERE ---------------------------------------------
//how can this be null as it is boolean?
if (!isWifiP2pEnabled) {

    //peerSearchError =  "Wifi is off!";

    return;
}

}

isWifiP2pEnabled是一种在发现wifi状态时从广播接收器调用的方法

public void setIsWifiP2pEnabled(boolean WifiP2pEnabled) {

    isWifiP2pEnabled = WifiP2pEnabled;
}

这不是所有的广播接收器,但这里是调用上述方法的地方..

if (state == WifiP2pManager.WIFI_P2P_STATE_ENABLED) {

    activity.toastme("wifi is enabled..");
    // Wifi Direct mode is enabled
    activity.setIsWifiP2pEnabled(true);
} else {
    activity.toastme("wifi is not enabled..");
    activity.setIsWifiP2pEnabled(false);

}

我不确定发生了什么以及它为什么不这样做,通过它,它检查wifi是否打开,然后成功设置 isWifiP2pEnabled 这很奇怪...我是做错了!isWifiP2pEnabled

按要求提供TOASTME

public void toastme(String s){
   Toast a;
    a = Toast.makeText(this, s, Toast.LENGTH_SHORT);
    a.show();

}

AuthenticateClick调用wifiService的地方

public void authenticateClick(View v) {

    wifiService.peerSearch();

    if (wifiService.peers != null) {
        peers = wifiService.peers;
    }

    Toast s = Toast.makeText(this, peers.toString(), Toast.LENGTH_LONG);
    s.show();

}

请注意,该服务正在onCreate上初始化(此外,服务已创建,并且正在此期间运行)

2 个答案:

答案 0 :(得分:1)

您正在Service

中拨打此电话
activity.toastme("wifi is enabled..");

&#34;活动&#34;在您的问题中没有定义或解释。但是,如果你有一个名为&#34; activity&#34;在Service {} {}} {}} {}} {}} {}}} {{}} {}}} {{}}}它。所以你的活动&#34;变量可能是非null,但这并不意味着它具有有效的上下文。因此,这一行:

Service

可能有一个&#34; null&#34;上下文(以及对Activity的引用无效)

答案 1 :(得分:1)

  

在顶部声明服务&#39; //实例化图书馆类wifiDirectService wifiService = new wifiDirectService();&#39;

从不自己创建Service的实例。从代码中删除此行以及对wifiService的所有引用。

如果您想提出Toast,那很好,但使用框架创建的Context并递交给您。如果活动希望提出Toast,则活动本身就是一个很好的Context用于此目的。

如果您真的希望在服务中使用自己的活动呼叫方法,则需要use the binding pattern and bind to the service