2014-12-14 3 views
0

Я создаю приложение для ношения, просто отправлю сообщение на телефон, чтобы показать 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(); 
     } 
    } 
} 

ответ

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.

+0

Наконец, я использовал AsincTask для извлечения nodeId, и он отлично работал! – user3583884

Смежные вопросы