来自 AWS Mobile Hub 示例项目的 PushManager class 上的空对象引用

Null Object Reference on PushManager class from AWS Mobile Hub Sample Project

我已经从 AWS Mobile Hub 下载了一个示例项目,其中集成了 SNS 推送服务。

在我现有的应用程序中,我将 com.amazonaws.mobile 包复制到我的应用程序 java 目录中。此外,我已将 AWS gradle 库添加到模块的 gradle 文件中,并将 meta-datareceiver 属性添加到清单文件中。

在我的MainActivity.java中我有这个代码:

import com.amazonaws.mobile.AWSMobileClient;
import com.amazonaws.mobile.push.PushManager;

private PushManager pushManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    ...
    pushManager = AWSMobileClient.defaultMobileClient().getPushManager();
    toggleNotification(true);
}

toggleNotification 方法取自演示应用程序。有问题的部分是我初始化 pushManager (pushManager = AWSMobileClient...) 的行。这是日志:

E/AndroidRuntime: FATAL EXCEPTION: main
                                                                   Process: com.intap.snspushtest, PID: 25796
                                                                   java.lang.RuntimeException: Unable to start activity ComponentInfo{com.intap.snspushtest/com.intap.snspushtest.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'com.amazonaws.mobile.push.PushManager com.amazonaws.mobile.AWSMobileClient.getPushManager()' on a null object reference
                                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
                                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
                                                                       at android.app.ActivityThread.access00(ActivityThread.java:221)
                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                       at android.os.Looper.loop(Looper.java:158)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:7224)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                                                                    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.amazonaws.mobile.push.PushManager com.amazonaws.mobile.AWSMobileClient.getPushManager()' on a null object reference
                                                                       at com.intap.snspushtest.MainActivity.onCreate(MainActivity.java:29)
                                                                       at android.app.Activity.performCreate(Activity.java:6876)
                                                                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1135)
                                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3206)
                                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
                                                                       at android.app.ActivityThread.access00(ActivityThread.java:221) 
                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                       at android.os.Looper.loop(Looper.java:158) 
                                                                       at android.app.ActivityThread.main(ActivityThread.java:7224) 
                                                                       at java.lang.reflect.Method.invoke(Native Method) 
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 

它说 getPushManager() 是一个空对象引用,这很奇怪,因为在示例应用程序中它运行良好,而且我没有对复制的文件进行任何更改...

你能帮我一下吗?我仍在尝试弄清楚为什么它为空...

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.amazonaws.mobile.push.PushManager com.amazonaws.mobile.AWSMobileClient.getPushManager()' on a null object reference

这表明 AWSMobileClient.defaultMobileClient() 返回了 null,因此无法调用 getPushManager()。在调用 AWSMobileClient.defaultMobileClient() 之前,必须先调用 AWSMobileClient.initializeMobileClientIfNecessary(context) 以初始化移动客户端。初始化一般在Applicationclass中进行,如下图:

import android.support.multidex.MultiDexApplication;
import android.util.Log;

import com.amazonaws.mobile.AWSMobileClient;

/**
 * Application class responsible for initializing singletons and other common components.
 */
public class Application extends MultiDexApplication {

    private final static String LOG_TAG = Application.class.getSimpleName();

    @Override
    public void onCreate() {
        Log.d(LOG_TAG, "Application.onCreate - Initializing application...");
        super.onCreate();
        initializeApplication();
        Log.d(LOG_TAG, "Application.onCreate - Application initialized OK");
    }

    private void initializeApplication() {

        // Initialize the AWS Mobile Client
        AWSMobileClient.initializeMobileClientIfNecessary(getApplicationContext());

        // ... Put any application-specific initialization logic here ...
    }
}