Android Wear ProgressDialog 和 MessageAPI 问题
Android Wear ProgressDialog and MessageAPI problems
我目前有一个 Android Wear 应用程序,它向用户显示包含 10 个项目的列表。打开应用程序时,会出现一个带有单个图像的初始屏幕,同时会向 phone 发送一条消息以检索必要的列表数据。
我想在图像下方添加 ProgressDialog。我的第一个问题是,这可能吗?如果是,怎么做?
我将 post 下面的代码,但我遵循了此处制作 ProgressDialog 的建议:Android loading animation 。我可以成功创建 ProgressDialog,但我遇到了一些问题。
- ProgressDialog 视图替换了我的初始初始屏幕图像。
doInBackground()
调用函数向配对的 phone 发送消息以获取列表数据。由于它必须在 onMessageReceived()
中等待响应,因此它会立即调用 onPostExecute()
并关闭对话。
- 如果我尝试手动调用
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 组件,并在启动进程时显示该组件,并在完成时隐藏它?
我目前有一个 Android Wear 应用程序,它向用户显示包含 10 个项目的列表。打开应用程序时,会出现一个带有单个图像的初始屏幕,同时会向 phone 发送一条消息以检索必要的列表数据。
我想在图像下方添加 ProgressDialog。我的第一个问题是,这可能吗?如果是,怎么做?
我将 post 下面的代码,但我遵循了此处制作 ProgressDialog 的建议:Android loading animation 。我可以成功创建 ProgressDialog,但我遇到了一些问题。
- ProgressDialog 视图替换了我的初始初始屏幕图像。
doInBackground()
调用函数向配对的 phone 发送消息以获取列表数据。由于它必须在onMessageReceived()
中等待响应,因此它会立即调用onPostExecute()
并关闭对话。- 如果我尝试手动调用
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 组件,并在启动进程时显示该组件,并在完成时隐藏它?