我希望在此期间在onCreate()
中发出http请求(我使用ksoap2),我希望屏幕上有ProgressDialog
来阻止用户。请求完成后,我想使用从http请求中检索的元素完成onCreate。
目前:
我有一个实现Runnable的类。我在onCreate中实例化它。此类发出http请求,在此期间,屏幕上会出现ProgressDialog。一旦完成,ProgressDialog就会被解雇。但由于它不在UI线程中,因此在获取http请求的结果之前执行onCreate的以下内容。
我首先尝试过:在onCreate中我执行了我的ProgressDialog的show()
然后是http请求,然后是dismiss()
ProgressDialog,最后用我的http请求的结果完成了我的onCreate。除了ProgressDialog没有显示这个时间外,没关系。
对于凌乱的解释感到抱歉,我的英语也没有帮助。
无论如何,想法?
感谢。
PS:BTW我知道AsyncTask更好,这是我通常使用的,但使用ProgressDialog并不容易。
我的问题更多:onCreate()
是否有办法发出http请求以获取int
的值。在发出此请求时:显示ProgressDialog
以阻止用户,但也阻止UI线程,以便onCreate的末尾可以使用http请求完成后检索的值。
一个丑陋的方式是onCreate中的一个循环,睡眠等待检索的值......这真的很难看。
答案 0 :(得分:1)
编辑:我知道你提到你不想使用AsyncTask
,因为显示ProgressDialog
的复杂性,但除非我遗漏了一些内容,否则应该像下面这样简单。或者,您可以使用处理程序来触发回调吗?
我认为在HTTP
请求完成后需要某种处理程序来回调,然后在回调中完成代码。
我还使用ksoap2
进行网络服务调用,并在调用时显示ProgressDialog
。 Web服务器调用完成后,它会引发一个事件,然后关闭ProgressDialog
。我不确定这对你有帮助,但我有以下(当然,可能有更好的方法,但这对我有用),这样在UI线程上调用ProgressDialog
,{ {1}}完成并调用complete方法(将线程返回给UI)并解除对话框:
AsyncTask
编辑:我认为您要问的是 // Notify user the web service is connecting
final ProgressDialog dialog = ProgressDialog.show(
Screen_GlobalLeaderboard.this, "Getting scores",
"Please wait...", true);
dialog.setCancelable(true);
WebService ws = new WebService(this) {
@Override
public void webServiceCallComplete(boolean success, Object data,
String errorMessage, WebMethods callingWebMethod) {
dialog.dismiss();
// Your complete code here
}
};
ws.getTopLeaderboardResults(top, gameMode);
(从UI线程运行),您想要显示onCreate
并在同一方法中返回HTTP请求中的值和一次它完成后,隐藏对话框。
然后你说你已经尝试过,ProgressDialog
没有显示。这是因为您使用HTTP请求阻止UI线程。
如果你从ProgressDialog
方法调用HTTP请求,你必须在一个单独的线程中运行它(或者像你一样,实现onCreate
)和一个处理器,它将调用你的runnable然后可以处理返回值。
简单地说,你不能:
显示Runnable
>调用HTTP请求>获得价值>隐藏ProgressDialog
而不为HTTP请求添加另一个线程(或ProgressDialog
将不显示),这反过来意味着您的返回HTTP请求代码必须在调用ProgressDialog
方法之外。
答案 1 :(得分:1)
在oncreate
节目dialog first
中,然后创建一个thread
,然后在那里http task
进行操作,完成该调用后,handler
即可线程和dismiss
对话框。