Android Wear ProgressDialog 和 MessageAPI 问题

Android Wear ProgressDialog and MessageAPI problems

我目前有一个 Android Wear 应用程序,它向用户显示包含 10 个项目的列表。打开应用程序时,会出现一个带有单个图像的初始屏幕,同时会向 phone 发送一条消息以检索必要的列表数据。

我想在图像下方添加 ProgressDialog。我的第一个问题是,这可能吗?如果是,怎么做?

我将 post 下面的代码,但我遵循了此处制作 ProgressDialog 的建议:Android loading animation 。我可以成功创建 ProgressDialog,但我遇到了一些问题。

  1. ProgressDialog 视图替换了我的初始初始屏幕图像。
  2. doInBackground() 调用函数向配对的 phone 发送消息以获取列表数据。由于它必须在 onMessageReceived() 中等待响应,因此它会立即调用 onPostExecute() 并关闭对话。
  3. 如果我尝试手动调用 onPostExecute(),在我获得列表数据后,ProgressDialog 永远不会关闭。

如有任何帮助,我们将不胜感激。谢谢。

public class InitialActivity extends Activity implements
        GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener,
        MessageApi.MessageListener{
    private WearableListItem[] items = new WearableListItem[10];
    private String nodeID;
    private GoogleApiClient mGoogleApiClient;
    private ProgressDialog mDialog;
    private ProgressTask progressTask;
    private boolean done = false;

    private class ProgressTask extends AsyncTask<Void, Void, Void>{
        ProgressDialog asyncDialog = new ProgressDialog(InitialActivity.this);

        @Override
        protected void onPreExecute(){
            //set message of the dialog
            asyncDialog.setMessage("Loading...");
            asyncDialog.setCancelable(false);
            //show dialog
            asyncDialog.show();
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            //don't touch dialog here it'll break the application
            //do some lengthy stuff like calling login webservice
            retrieveDeviceNode();
            return null;
        }

        @Override
        protected void onPostExecute(Void result){
            //hide the dialog
//            if(done)
//            {
                asyncDialog.dismiss();
//            }
            super.onPostExecute(result);
        }
    }

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.load_screen);

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

    @Override
    protected void onResume() {
        super.onResume();
        mGoogleApiClient.connect();
    }

    @Override
    public void onConnected(Bundle bundle) {
        Wearable.MessageApi.addListener(mGoogleApiClient, this);
//        retrieveDeviceNode();
        progressTask = new ProgressTask();
        progressTask.execute();
    }

    @Override
    protected void onPause(){
        super.onPause();
        Wearable.MessageApi.removeListener(mGoogleApiClient, this);
        mGoogleApiClient.disconnect();
    }

    private void sendMessage(String message) {
        Wearable.MessageApi.sendMessage(mGoogleApiClient, nodeID, message, null);
    }

    @Override
    public void onMessageReceived(MessageEvent messageEvent) {
        nodeID = messageEvent.getSourceNodeId();
        if (messageEvent.getPath().contains("/joblist")) {
            List<Drawable> drawables = getDrawableList(messageEvent.getData());
            String jobList = messageEvent.getPath().substring(8);
            initJobList(jobList, drawables);
            done = true;
            progressTask.onPostExecute(null);
            Intent intent = new Intent(this,MainActivity.class);
            startActivity(intent);
        }
    }

    private void retrieveDeviceNode(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                NodeApi.GetConnectedNodesResult result = Wearable.NodeApi.getConnectedNodes(mGoogleApiClient).await();
                if(result.getNodes().size() > 0){
                    nodeID = result.getNodes().get(0).getId();
                    sendMessage("/getWearData");
                }
                else{
                    nodeID = "";
                }
            }
        }).start();
    }
}

为什么不简单地在显示图像的视图中添加一个 ProgressBar 组件,并在启动进程时显示该组件,并在完成时隐藏它?