【问题标题】:How to properly instantiate DataClient so that it is not NULL when I attempt to send DataItem?如何正确实例化 DataClient 以使其在我尝试发送 DataItem 时不为 NULL?
【发布时间】:2019-02-17 16:14:29
【问题描述】:

我正在尝试通过 DataLayer 将数据从我的可穿戴设备发送到我的手机。移动端的代码还没写完,是不是必须写完才能从可穿戴设备发送到DataLayer?

现在,当我尝试执行 mDataClient.putDataItem(putDataReq) 时,我收到此错误:java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.tasks.Task com.google.android.gms.wearable.DataClient.putDataItem(com.google.android.gms.wearable.PutDataRequest)' on a null object reference

sendData(data) 正在被另一个类调用,这应该没有问题,因为我有调试日志确认它正在工作。

我尝试使用 GoogleApiClient.Builder(this).addApi(Wearable.API) 并改为通过 Wearable.DataApi.putDataItem(mGoogleApiClient, putDataReq) 发送内容,但即使是 mGoogleApiClient 在我这样做时也会返回 null。

这是我的 build.gradle 文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28


    defaultConfig {
        applicationId "com.example.watchsleep"
        minSdkVersion 23
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])

    implementation 'com.google.android.support:wearable:2.4.0'
    implementation 'com.google.android.gms:play-services-wearable:16.0.1'
    implementation 'com.android.support:percent:28.0.0'
    implementation 'com.android.support:support-v4:28.0.0'
    implementation 'com.android.support:recyclerview-v7:28.0.0'
    implementation 'com.android.support:wear:28.0.0'
    compileOnly 'com.google.android.wearable:wearable:2.4.0'
}

这是我的代码:

public class WearActivity extends WearableActivity implements DataClient.OnDataChangedListener {
private static final String COUNT_KEY = "com.example.count";
private DataClient mDataClient; 

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

    // Enables Always-on
    setAmbientEnabled();

    // initialise API client for sending data to phone here

    mDataClient = Wearable.getDataClient(this);
}
@Override
protected void onStart(){
    super.onStart();
    Log.d(TAG, "onStart");
    mDataClient = Wearable.getDataClient(this);
}

@Override
protected void onResume() {
    super.onResume();
    Log.d(TAG, "onResume");
    mDataClient = Wearable.getDataClient(this);
    Wearable.getDataClient(this).addListener(this);
}

@Override
protected void onPause() {
    super.onPause();
    Log.d(TAG, "onPause");
    Wearable.getDataClient(this).removeListener(this);
}

@Override
public void onDataChanged(DataEventBuffer dataEvents) {
    for (DataEvent event : dataEvents) {
        if (event.getType() == DataEvent.TYPE_DELETED) {
            Log.d(TAG, "DataItem deleted: " + event.getDataItem().getUri());
        } else if (event.getType() == DataEvent.TYPE_CHANGED) {
            Log.d(TAG, "DataItem changed: " + event.getDataItem().getUri());
        }
    }
}


// Create a data map and put data in it
public void sendData(ArrayList<String> data) {
    Log.d(TAG, "sending data");

    PutDataMapRequest putDataMapReq = PutDataMapRequest.create("/count"); // create data map
    putDataMapReq.getDataMap().putStringArrayList(COUNT_KEY, data); // put data in map

    PutDataRequest putDataReq = putDataMapReq.asPutDataRequest();

    Task<DataItem> putDataTask = mDataClient.putDataItem(putDataReq); // ERROR COMES FROM THIS LINE
    putDataTask.addOnSuccessListener(
            new OnSuccessListener<DataItem>() {
                @Override
                public void onSuccess(DataItem dataItem) {
                    Log.d(TAG, "Sending text was successful: " + dataItem);
                }
            });


}
}

感觉好像我在代码中遗漏了一些非常简单的东西,但我不知道它是什么。任何帮助将不胜感激。

【问题讨论】:

  • 你的WearActivity 是在sendData 被调用之前实例化的吗?为什么不在发生这种情况的地方初始化数据 API?
  • 原来,我在课堂上错误地调用了sendData(),这个错误与 DataClient 无关,而是与不正确的实例化有关。现在已经解决了,谢谢!

标签: android wear-os android-wear-data-api


【解决方案1】:

问题是通过这样做在我的班级中调用sendData()

WearActivity mAct = new WearActivity();
mAct.sendData();

根据here 给出的答案,我已经将其更改为通过将活动添加到类构造函数中作为参数发送,如下所示:

// in WearActivity
MyClass instanceClass = new MyClass(this);

// in MyClass
public class MyClass{
    private WearActivity mAct;
    public MyClass (WearActivity activity) {
        mAct = activity;
    }

// code
mAct.sendData();

【讨论】:

    猜你喜欢
    • 2021-05-26
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2016-03-27
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多