2011-09-30 123 views
1

我想在此期间发出一个http请求(我使用kso​​ap2)onCreate(),我希望屏幕上有ProgressDialog来阻止用户。请求完成后,我想使用从我的http请求中检索到的元素完成我的onCreate。活动和线程处理

现在:

我有一个类实现了Runnable。我在我的onCreate中实例化它。该类发出http请求,在此期间ProgressDialog在屏幕上。完成后,ProgressDialog将被解除。但由于它不在UI线程中,因此在获取http请求的结果之前,会执行onCreate的以下内容。

我也试过,首先:在OnCreate我做我的ProgressDialog的show()然后HTTP请求,然后一个dismiss() ProgressDialog终于完成我的onCreate我的HTTP请求的结果......这是除了ProgressDialog OK这次没有显示。

对不起,我的英语真的没有帮助。

无论如何,想法?

谢谢。

PS:顺便说一声,我知道AsyncTask更好,这是我通常使用的,但它与ProgressDialog并不容易。

我的问题是:有没有办法在onCreate()做出http请求来获得int的值。在发出此请求时:显示ProgressDialog以阻止用户,但也会阻止UI线程,以便onCreate的末尾可以在完成后使用http请求检索的值。

一个丑陋的方式将是一个循环在onCreate与休眠等待值被检索......这真的很难看。

+0

即使它不是那么容易,你应该选择AsyncTask。这是您的问题的正确解决方案。 –

+0

如果我解决了我的问题,我肯定会回到这个。我编辑我的问题更清晰......我希望。谢谢。 – mthpvg

回答

1

编辑:我知道你提到你不想使用AsyncTask由于显示ProgressDialog的复杂性,但除非我错过了一些东西,它应该像下面一样简单。或者,您可以使用处理程序来触发回拨?

我想你需要某种处理程序来回调,一旦HTTP请求完成,然后在回调完成你的代码。

我还使用ksoap2进行Web服务调用,并在调用它时显示ProgressDialog。一旦Web服务器调用完成,它会引发一个事件,并关闭ProgressDialog。我不确定这是否会对您有所帮助,但我有以下(当然,可能有更好的方法,但这对我有用),这样ProgressDialog在UI线程上被调用,AsyncTask完成并调用完整的方法(它返回线程回到UI),我关闭该对话框:

// 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); 

编辑:我想你问的是onCreate(从UI线程RAN),你想显示ProgressDialog并在同一个方法中从HTTP请求返回一个值,一旦它完成,隐藏对话框。

然后你说你已经试过,并且ProgressDialog没有显示。这是因为您使用HTTP请求阻止UI线程。

提供了调用从onCreate方法的HTTP请求,你必须在一个单独的线程(或为你做,实现Runnable)和处理程序将调用运行的,使用它可以再处理的返回值运行。

简而言之,你不能:

显示ProgressDialog>呼叫HTTP请求>获取值>隐藏ProgressDialog无需添加其他线程的HTTP请求(或ProgressDialog不会显示),这反过来又意味着你的回报HTTP请求代码必须在调用onCreate方法之外。

+0

对不起,我不知道什么是WebService,也不是覆盖方法。谢谢。 – mthpvg

+0

WebService是一个抽象类,它调用一个AsyncTask,一旦它完成,它调用'webServiceCallComplete',你可以关闭对话框。或者,使用加载'ProgressDialog',运行一个线程来完成工作,并使用一个处理程序来调用'runnable'来关闭对话框,并根据返回值执行所需操作。 – Ricky

+0

好吧,我明白了。我编辑我的问题,因为它更多地关于在显示ProgressDialog时阻止UI线程等待结果。完成后,关闭对话框,并使用获得的结果“恢复”创建。 – mthpvg

1

在你oncreate显示dialog first,然后创建一个thread做你http task那里,一旦你做完这些调用从线程handlerdismiss你的对话框。

+0

通过将对话框放入Runnable类中,它的工作方式与我的解决方案一样好。谢谢。 – mthpvg