java - Google Analytics Android 错误 java.lang.NullPointerException

标签 java android google-analytics

我正在尝试为 Android 开发 Google Analytics。我收到消息,并且正在关注 advanced configuration of Android Analytics in Google Android SDK .

java.lang.RuntimeException: Unable to start activity 
  ComponentInfo{com.example.secondapp/com.example.secondapp.MainActivity}:
  java.lang.NullPointerException

我收到此错误:

01-02 15:39:38.410: D/AndroidRuntime(1338): Shutting down VM
01-02 15:39:38.410: W/dalvikvm(1338): threadid=1: thread exiting with uncaught exception (group=0xb1ab7ba8)
01-02 15:39:38.420: E/AndroidRuntime(1338): FATAL EXCEPTION: main
01-02 15:39:38.420: E/AndroidRuntime(1338): Process: com.example.secondapp, PID: 1338
01-02 15:39:38.420: E/AndroidRuntime(1338): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.secondapp/com.example.secondapp.MainActivity}: java.lang.NullPointerException
01-02 15:39:38.420: E/AndroidRuntime(1338):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at android.os.Handler.dispatchMessage(Handler.java:102)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at android.os.Looper.loop(Looper.java:136)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at android.app.ActivityThread.main(ActivityThread.java:5017)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at java.lang.reflect.Method.invokeNative(Native Method)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at java.lang.reflect.Method.invoke(Method.java:515)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at dalvik.system.NativeStart.main(Native Method)
01-02 15:39:38.420: E/AndroidRuntime(1338): Caused by: java.lang.NullPointerException
01-02 15:39:38.420: E/AndroidRuntime(1338):     at com.example.secondapp.MainActivity.onCreate(MainActivity.java:24)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at android.app.Activity.performCreate(Activity.java:5231)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-02 15:39:38.420: E/AndroidRuntime(1338):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
01-02 15:39:38.420: E/AndroidRuntime(1338):     ... 11 more

这是我的 SecondAppApplication 代码,它与 android 文档有相似之处:

public class SecondAppApplication extends Application {

    private static GoogleAnalytics mGa;
    private static Tracker mTracker;

    private static final String GA_PROPERTY_ID = "UA-XXXXXXXX-1";
    private static final int GA_DISPATCH_PERIOD = 30;
    private static final boolean GA_IS_DRY_RUN = false;
    private static final LogLevel GA_LOG_VERBOSITY = LogLevel.INFO;
    private static final String TRACKING_PREF_KEY = "trackingPreferences";

    @SuppressWarnings("deprecation")
    private void initializeGa() {
        mGa = GoogleAnalytics.getInstance(this);
        mTracker = mGa.getTracker(GA_PROPERTY_ID);

        GAServiceManager.getInstance().setLocalDispatchPeriod(GA_DISPATCH_PERIOD);

        mGa.setDryRun(GA_IS_DRY_RUN);

        mGa.getLogger().setLogLevel(GA_LOG_VERBOSITY);

        SharedPreferences userPrefs = PreferenceManager.getDefaultSharedPreferences(this);
        userPrefs.registerOnSharedPreferenceChangeListener(new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                if (key.equals(TRACKING_PREF_KEY)) {
                    GoogleAnalytics.getInstance(getApplicationContext()).setAppOptOut(sharedPreferences.getBoolean(key, false));
                }
            }
        });

    }

    @Override
    public void onCreate() {
        super.onCreate();
        initializeGa();
    }

    public static Tracker getGaTracker() {
        return mTracker;
    }

    public static GoogleAnalytics getGaInstance() {
        return mGa;
    }

}

这是我的 MainActivity 类:

public class MainActivity extends Activity {

    public static final String EXTRA_MESSAGE = "com.example.myfirstapp.MESSAGE";
    private static final String SCREEN_LABEL = "Main Screen";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        SecondAppApplication.getGaTracker().set(Fields.SCREEN_NAME,SCREEN_LABEL);
        setContentView(R.layout.main);
    }

    @Override
    public void onStart() {
        super.onStart();
        SecondAppApplication.getGaTracker().send(MapBuilder.createAppView().build());
    }

    @Override
    public void onStop() {
        super.onStop();
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.main, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()) {
            case R.id.action_search:
                openSearch();
                return true;
            case R.id.action_settings:
                openSettings();
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }

    public void openSearch() {

    }

    public void openSettings() {

    }


    public void sendMessage(View view) {
        Intent intent = new Intent(this,DisplayMessageActivity.class);
        EditText editText = (EditText) findViewById(R.id.edit_message);
        String message = editText.getText().toString();
        intent.putExtra(EXTRA_MESSAGE, message);
        startActivity(intent);
    }

}

为什么java.lang.NullPointerException存在,和/或我该如何解决这个问题?

我需要在 MainActivityAndroidManifest.xml 中再次声明 initializeGa() 吗?

最佳答案

在我看来:

SecondAppApplication.getGaTracker().set(Fields.SCREEN_NAME,SCREEN_LABEL);

可能是在空对象上调用 set 方法,因为您静态访问时没有先初始化它。这几乎看起来就像你试图做一个单例或其他什么......

我会将您的代码更改为:

public static Tracker getGaTracker() {
    if(mTracker ==null) {
      initialize();
    }
    return mTracker;
}

问题当然是,由于您是静态执行此操作,因此您不会传递上下文......我认为您可能需要稍微重新组织该项目。

看看这个:

Android: Persist object across activities

关于java - Google Analytics Android 错误 java.lang.NullPointerException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20891666/

相关文章:

android - 如何获得带小数点的电池温度?

google-analytics - 什么时候应该使用自定义指标,什么时候应该使用事件值?

android - 跨平台移动应用程序中的 Google Analytics

android - Analytics sendEvent 不发送数据

java - 按下按钮时弹出多个框架

jquery - 使用 jQuery 在 Android 上确定长按(长按,点击保持)

android - 如何使用谷歌地图使安卓应用离线?或使用谷歌地图下载 Android 应用程序中的 map 区域以供离线使用?

java - 如何在 GWT 中加入 Google Adsense

java - 如何在 Java 和 Eclipse 中使用包?

java - 多个线程如何调用单例对象的方法并对其进行处理?