【问题标题】:Display progress dialog till a condition will be true or time ended显示进度对话框,直到条件为真或时间结束
【发布时间】:2015-04-04 23:57:39
【问题描述】:

我有一个用户提交登录表单的应用,当它发送数据时到服务器并为其帐户创建连接

在这个连接中,我有一个名为 state 的整数字段。
状态值是:1 表示连接2 表示已连接0 表示失败

我想显示一个对话框给用户 show is Connecting ... 然后检查连接状态如果它返回 0 或 2 关闭对话框并显示相关消息 else if it doesn't change after 15 sec dismiss dialog 并将状态更改为 0 !

我该怎么做这个逻辑?

【问题讨论】:

  • 到目前为止您尝试过什么?还是直接要代码?
  • 我不确定我可以从哪里以及如何开始!
  • 我猜你想实现一个超时逻辑。也许this问题可以帮助你。

标签: java android


【解决方案1】:

我假设你使用 Asynctask 来制作网络。在这种情况下,您可以使用 onPreExecute 和 onPostExecute 方法。

有关网络调用和 Asynctasks 的更多信息,请阅读http://developer.android.com/training/basics/network-ops/connecting.html。我在下面给出了一个简短的解释。

如果您在 onCreate 方法(或类似方法)中创建或初始化对话框,则可以调用以下方法在调用开始和结束时显示和隐藏对话框

onPreExecute() {
    dialog.show();
}

onPostExecute(Object result) {
    dialog.dismiss();
}

您还可以通过使用 onProgressUpdate() 从 doInBackground 修改 UI。这将允许您在通过调用方法 publishProgress() 执行 doInBackground 中的逻辑时调用对话框。您应该调用该方法的确切位置我不确定,因为我不完全了解您的大局,但我希望这对您有所帮助

【讨论】:

  • 感谢您的回答!但是我使用异步任务进行连接,并且我更改了onPostExecute 中的状态,我的问题是我想检查状态,当它在 15 秒之前更改时向用户显示他已登录的对话框或其他任何错误或显示失败15 秒后的消息
  • 我已经用一种方法修改了我的答案,该方法允许您在 doInBackground 调用中途更改对话框
  • 正如你所说的一半,我的问题在另一半:D
  • 你能告诉我如何在限定时间内完成 doInBackground 方法吗?
  • 我有一个想法,即使用带有 15 秒计时器的处理程序,并使用在 doInBackground 中检查的标志。如果此标志设置为 true,则 doInBackground 将返回 null。我现在不在我的机器上,所以无法对其进行测试,因此我只能给出想法和简短的实现
【解决方案2】:

这是一种方式。你也可以使用AsyncTask.onCancelled()

public class TestActivity extends Activity{
    private Dialog dialog;
@override
protected void onCreate(Bundle bundle){
    //relevant activity code.
    TestAsync ta=new TestAsync().execute();
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            ta.cancel();
            if(dialog!=null)
                dialog.dismiss();
        }
    }15*1000);

}


public class TestAsync extends AsyncTask<Void, Void, Void> {




@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();
    //create your dialog here

}

@Override
protected void onPostExecute(Void result) {

    if(dialog!=null){
        dialog.dismiss();
    }
}

@Override
protected Void doInBackground(Void... params) {
    //relevant AsyncTask code
}


}

}

【讨论】:

    猜你喜欢
    • 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
    相关资源
    最近更新 更多