发送ArrayList<> DataItem从移动到佩戴

时间:2016-03-28 00:00:02

标签: java android arraylist android-wear-data-api dataitem

目前我的问题是每当我尝试访问ArrayList<>我已通过我的DataItem层发送,它告诉我该对象为空。

有人能否解决问题在哪里发生?

移动

public class MainActivity extends AppCompatActivity implements  GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

--variables

@Override
protected void onCreate(Bundle savedInstanceState) {

    if(!PreferenceManager.getDefaultSharedPreferences(this)
            .getStringSet("wristaroo", new HashSet<String>()).isEmpty()) {
        tasksSet = PreferenceManager.getDefaultSharedPreferences(this)
                .getStringSet("wristaroo", new HashSet<String>());
        actsList = new ArrayList<>(tasksSet);
    }
    -----

    googleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(Wearable.API)
            .build();

    googleApiClient.connect();

    super.onCreate(savedInstanceState);
    -----
    Button btnSave = (Button) findViewById(R.id.sendButton);
    btnSave.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            PutDataMapRequest dataMap = PutDataMapRequest.create("/wristaroo/customschedule");
            dataMap.getDataMap().putStringArrayList("schedule", actsList);
            PutDataRequest request = dataMap.asPutDataRequest();


            PendingResult<DataApi.DataItemResult> result = Wearable.DataApi
                    .putDataItem((googleApiClient), request);
            System.out.println("Request: " + request);
            System.out.println("Result: " + result);

        }
    });
}

-----

@Override
public void onConnected(Bundle bundle) {

    new DataTask (this, actsList).execute();
}

@Override
public void onConnectionSuspended(int i) {

}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {

}

class DataTask extends AsyncTask<Node, Void, Void> {

    private ArrayList<String> contents;
    Context c;

    public DataTask ( Context c, ArrayList<String> contents) {
        this.c = c;
        this.contents = contents;
    }

    @Override
    protected Void doInBackground(Node... nodes) {
        PutDataMapRequest dataMap = PutDataMapRequest.create("/wristaroo/customschedule").setUrgent();
        dataMap.getDataMap().putStringArrayList("schedule", actsList);

        PutDataRequest request = dataMap.asPutDataRequest().setUrgent();
        Log.i("Data", "data");
        DataApi.DataItemResult dataItemResult = Wearable.DataApi
                .putDataItem((googleApiClient), request).await();
        System.out.println("dataItemResult: " + dataItemResult);

        return null;
    }
}
}

WEAR

public class MainActivity extends Activity implements DataApi.DataListener,GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {

    super.onCreate(savedInstanceState);

    googleApiClient = new GoogleApiClient.Builder(this)
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(Wearable.API)
            .build();
---------

@Override
public void onConnected(Bundle bundle) {
    Wearable.DataApi.addListener(googleApiClient, this).setResultCallback(new ResultCallback<Status>() {
        @Override
        public void onResult(@NonNull Status status) {
            Log.i("myTag", String.valueOf(status));
        }
    });
    System.out.println("onConnected Activated!!!");
}

@Override
public void onDataChanged(DataEventBuffer dataEvents) {
    for (DataEvent event : dataEvents) {
        if (event.getType() == DataEvent.TYPE_CHANGED) {
            // DataItem changed
            DataItem item = event.getDataItem();
            if (item.getUri().getPath().compareTo("/wristaroo/customschedule") == 0) {
                DataMap dataMap = DataMapItem.fromDataItem(item).getDataMap();
                data = dataMap.getStringArrayList("schedule");
            }
        } else if (event.getType() == DataEvent.TYPE_DELETED) {
            // DataItem deleted
        }
    }
}

@Override
public void onConnectionSuspended(int i) {
}

@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) 

Manifest Mobile

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.michaeldvinci.conedmiro.schedaroo">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <meta-data android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version" />
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".EditActivity"
            android:label="@string/app_name">
        </activity>
        <activity
            android:name=".AddActivity"
            android:label="@string/app_name">
        </activity>
    </application>

</manifest>

明显的穿着

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.michaeldvinci.conedmiro.schedaroo">

    <uses-feature android:name="android.hardware.type.watch" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@android:style/Theme.DeviceDefault">
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".byDayActivity"
            android:label="@string/app_name">
        </activity>
        <activity
            android:name=".byChoiceActivity"
            android:label="@string/app_name">
        </activity>
        <activity
            android:name=".byStageActivity"
            android:label="@string/app_name">
        </activity>
        <activity
            android:name=".byTimeActivity"
            android:label="@string/app_name">
        </activity>
        <activity
            android:name=".byStageActActivity"
            android:label="@string/app_name">
        </activity>
    </application>

</manifest>

按移动应用程序上的[发送]按钮

时的输出
03-29 18:33:47.948 5246-5246/com.michaeldvinci.conedmiro.schedaroo W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=1307.8564, y[0]=2230.7813, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=473778, downTime=468682, deviceId=0, source=0x1002 }
03-29 18:33:47.948 5246-5246/com.michaeldvinci.conedmiro.schedaroo W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=1307.8564, y[0]=2230.7813, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=473778, downTime=468682, deviceId=0, source=0x1002 }
03-29 18:33:47.948 5246-5246/com.michaeldvinci.conedmiro.schedaroo W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=1307.8564, y[0]=2230.7813, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=473778, downTime=468682, deviceId=0, source=0x1002 }
03-29 18:33:47.948 5246-5246/com.michaeldvinci.conedmiro.schedaroo W/ViewRootImpl: Cancelling event due to no window focus: MotionEvent { action=ACTION_CANCEL, actionButton=0, id[0]=0, x[0]=1307.8564, y[0]=2230.7813, toolType[0]=TOOL_TYPE_FINGER, buttonState=0, metaState=0, flags=0x0, edgeFlags=0x0, pointerCount=1, historySize=0, eventTime=473778, downTime=468682, deviceId=0, source=0x1002 }
03-29 18:33:48.179 5246-5246/com.michaeldvinci.conedmiro.schedaroo I/System.out: Request: PutDataRequest[dataSz=108, numAssets=0, uri=wear:/wristaroo/customschedule, syncDeadline=0]
03-29 18:33:48.179 5246-5246/com.michaeldvinci.conedmiro.schedaroo I/System.out: Result: com.google.android.gms.wearable.internal.zzx$1@1ded1a8

1 个答案:

答案 0 :(得分:0)

这最终可能是一个错误的答案,但我认为setUrgent()标志可能很重要:

请使用此代码:

    PutDataMapRequest dataMap = PutDataMapRequest.create("/wristaroo/customschedule");
    dataMap.getDataMap().putStringArrayList("schedule", actsList);

    PutDataRequest request = dataMap.asPutDataRequest();
    request.setUrgent();
    Log.i("Data", "data");
    DataApi.DataItemResult dataItemResult = Wearable.DataApi
            .putDataItem((googleApiClient), request).await();