我有一个Android应用程序,它使用RPC机制设置/从服务器获取信息。我从主线程(阻塞)中调用RPC,我希望它们被阻塞。但是,有时呼叫可以持续几秒钟,并且我想在一段指定时间(例如1秒)后显示不确定的进度对话框。
我试图产生一个新的线程来进行调用,主线程在循环中等待(有睡眠),直到调用完成。在这个loope里面我展示了进度对话框,但这不起作用。
是否可以在另一个线程中显示和更新进度对话框,或者是否有人知道允许我使用阻止调用的更好的解决方案?
答案 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();