Я создаю приложение для ношения, просто отправлю сообщение на телефон, чтобы показать Toast, и пока все работает, но у меня проблема, он отправляет сообщения, когда пользователь взаимодействует с Wearable, и я хочу, чтобы мое приложение отправляло сообщение автоматически.Сообщение от Wearable to Phone
Проблема заключается в том, что если я вызову метод sendToast() в методе onCreate, логическая переменная nodeId внутри метода sendToast() имеет значение NULL, но если я нажимаю кнопку, то когда-то создается бесконечность, она отлично работает.
Я подозреваю, что, если я вызываю sendToast напрямую, нить не закончена и в тот точно момент у меня нет узла, но я не знаю, как его решить.
Я также судимое некоторые трюки, как те, но все они не смогли до сих пор:
Вызвать метод sendToast() внутри метода setupWidgets().
Имитировать клик, создавая экземпляр кнопки и используя метод .callOnClick() или performClick(), но так как я использую WatchViewStub (для работы с круглыми и squear wearables), я не могу присоединиться к нему, это дайте мне 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();
}
}
}
Наконец, я использовал AsincTask для извлечения nodeId, и он отлично работал! – user3583884