从Wearable到Phone的消息

时间:2014-12-14 19:52:36

标签: java android multithreading wear-os

我正在制作一个应用程序,只需向手机发送一条消息即可显示Toast,现在一切正常,但我遇到了问题,它只会在用户与可穿戴设备进行交互时发送消息我希望我的应用程序自动发送消息。

问题在于,如果我在onCreate方法中调用方法sendToast(),方法sendToast()中的布尔变量nodeId为null,但如果我在创建everithing时单击按钮,则它可以正常工作。

我怀疑如果我直接调用sendToast线程没有完成,那么在那个时刻我没有节点,但我不知道如何解决它。

我也尝试了一些这样的技巧,但到目前为止都失败了:

在方法setupWidgets()中调用方法sendToast()。

模拟点击创建按钮的实例并使用方法.callOnClick()或performClick(),但由于我使用WatchViewStub(使用圆形和吱吱声可穿戴设备)我无法访问它,它给我NullPointerException

在调用方法之前调用计时器以延迟执行。

到目前为止没有任何作品,任何人都可以帮助我吗?

非常感谢!!

这是我的代码:

public class Main extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);

        initApi();
        final WatchViewStub stub = (WatchViewStub) findViewById(R.id.watch_view_stub);
        stub.setOnLayoutInflatedListener(new WatchViewStub.OnLayoutInflatedListener() {

            @Override
            public void onLayoutInflated(WatchViewStub stub) {
                setupWidgets();
            }
        });
    }

    private void initApi() {
        client = getGoogleApiClient(this);
        retrieveDeviceNode();
    }

    private void setupWidgets() {
        clickButton = (Button) findViewById(R.id.btn_toast);
        clickButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sendToast();
            }
        });
    }

    private GoogleApiClient getGoogleApiClient(Context context) {
        return new GoogleApiClient.Builder(context)
            .addApi(Wearable.API)
            .build();
    }

    private void retrieveDeviceNode() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                client.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);
                NodeApi.GetConnectedNodesResult result =
                        Wearable.NodeApi.getConnectedNodes(client).await();
                List<Node> nodes = result.getNodes();
                if (nodes.size() > 0) {
                    nodeId = nodes.get(0).getId();
                }
                client.disconnect();
            }
        }).start();
    }

    private void sendToast() {
        if (nodeId != null) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    client.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS);
                    Wearable.MessageApi.sendMessage(client, nodeId, GET_CONTACTS, null);
                    client.disconnect();
                }
            }).start();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果你想从onCreate发送消息,你实际上想要这样做(这不是一个编译示例,但应该给你一个想法):

NodeApi.getConnectedNodes(client).setResultCallback(new ResultCallback<..>(List<Node> nodes) {
    String nodeId = nodes.get(0).getId();
    Wearable.MessageApi.sendMessage(client, nodeId, GET_CONTACTS, null);
}, TIMEOUT);

因此,基本上不是等待单独的线程,而是添加回调,当它返回时,发送消息。这样您就可以直接从onCreate安排邮件。