【问题标题】:Message from Wearable to Phone从可穿戴设备到手机的消息
【发布时间】:2014-12-15 09:23:03
【问题描述】:

我正在制作一个可穿戴的应用程序,它只需向手机发送消息以显示 Toast,现在一切正常,但我有一个问题,它只在用户与可穿戴设备交互并且我想要时发送消息我的应用会自动发送消息。

问题是,如果我在 onCreate 方法中调用方法 sendToast(),则方法 sendToast() 中的布尔变量 nodeId 为空,但如果我在创建所有内容后单击按钮,它会完美运行。

我怀疑如果我直接调用 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();
        }
    }
}

【问题讨论】:

    标签: java android multithreading wear-os


    【解决方案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 安排消息。

    【讨论】:

    • 最后我使用了一个 AsincTask 来检索 nodeId,它工作得很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多