Android:使用进度对话框阻止RPC

时间:2012-06-25 15:26:41

标签: android multithreading rpc

我有一个Android应用程序,它使用RPC机制设置/从服务器获取信息。我从主线程(阻塞)中调用RPC,我希望它们被阻塞。但是,有时呼叫可以持续几秒钟,并且我想在一段指定时间(例如1秒)后显示不确定的进度对话框。

我试图产生一个新的线程来进行调用,主线程在循环中等待(有睡眠),直到调用完成。在这个loope里面我展示了进度对话框,但这不起作用。

是否可以在另一个线程中显示和更新进度对话框,或者是否有人知道允许我使用阻止调用的更好的解决方案?

3 个答案:

答案 0 :(得分:0)

尝试使用AsyncTask。它是一种用于进行此类网络调用的android机制。在此处获取AsyncTask的简要详细信息:

Using AsynTask to show progress bar while attempting to SSH to Server

使用AsyncTask可以阻止用户继续前进。您必须在progress dialog的{​​{1}}方法中显示onPreExecute()。您的所有与网络相关的活动都将在AsyncTask中进行。后台操作完成后,将会调用doInBackground(),其中onPostExecute()将被解除。

progress dialog是一个异步调用,因为你有2个线程同时工作,一个是你在其上显示进度对话框的UI线程,另一个是非ui后台线程,它从中提取数据服务器

希望这个解释有所帮助。

答案 1 :(得分:0)

您不能同时执行这两项操作,使主线程在循环中等待并同时显示进度对话框。主线程等待或显示对话框。

为什么要阻止主线程?互联网上的通信应始终在后台线程中完成,因为您永远不知道完成所需的时间。在AsyncTask中执行该操作并在main中显示进度对话框。

答案 2 :(得分:0)

我找到了一个似乎有用的解决方案(至少我还没有注意到任何问题)。我知道正确的方法是使用类似AsyncTask的东西,但在我的情况下,我没有从中受益,它使程序逻辑变得复杂。

在新线程中更新UI:

    new Thread() 
    {
        public void run()
        {
            Looper.prepare();
            ... do UI stuff here
            Looper.loop();
        }
    }.start();