【问题标题】:Activity and thread handling活动和线程处理
【发布时间】:2011-09-30 13:18:30
【问题描述】:

我想在此期间在onCreate() 中发出一个http 请求(我使用kso​​ap2),我想在屏幕上显示一个ProgressDialog 来阻止用户。请求完成后,我想使用从 http 请求中检索到的元素来完成我的 onCreate。

现在:

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

我也尝试过,起初:在 onCreate 中,我执行我的 ProgressDialog 的 show(),然后是 http 请求,然后是 dismiss() ProgressDialog,最后以我的 http 请求的结果完成我的 onCreate... 没关系,除了ProgressDialog 这次没有显示。

对不起,我的解释很混乱,我的英语也没有帮助。

无论如何,想法?

谢谢。

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

我的问题更多:onCreate() 中有没有办法发出 http 请求以获取 int 的值。发出此请求时:显示ProgressDialog 以阻止用户但也阻止 UI 线程,以便 onCreate 结束后可以使用 http 请求检索到的值。

一种丑陋的方式是 onCreate 中的一个循环,其中睡眠等待检索值......这真的很丑陋。

【问题讨论】:

  • 您应该选择 AsyncTask,即使它并不容易。这是解决您问题的正确方法。
  • 如果我解决了我的问题,我肯定会回到这个。我编辑我的问题更清楚......我希望。谢谢。

标签: android progressdialog ksoap2


【解决方案1】:

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

我认为您需要某种处理程序来在完成HTTP 请求后进行回调,然后在回调中完成您的代码。

我还使用ksoap2 进行网络服务调用,并在调用时显示ProgressDialog。 Web 服务器调用完成后,它会引发一个事件,然后我关闭 ProgressDialog。我不确定这是否会帮助你,但我有以下(当然,可能有更好的方法,但这对我有用),这样在 UI 线程上调用 ProgressDialogAsyncTask完成并调用 complete 方法(将线程返回到 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 线程运行),你想显示一个 ProgressDialog 并以相同的方法从 HTTP 请求返回一个值,一旦完成,隐藏对话框。

然后您说您已经尝试过了,但 ProgressDialog 没有显示。这是因为您使用 HTTP 请求阻塞了 UI 线程。

如果你从 onCreate 方法调用 HTTP 请求,你必须在一个单独的线程中运行它(或者像你做的那样,实现 Runnable)和一个处理程序,该处理程序将调用 runnable,然后你可以使用它来处理返回值。

简单地说,你不能:

显示ProgressDialog>调用HTTP请求>获取值>隐藏ProgressDialog而不为HTTP请求添加另一个线程(或者ProgressDialog不会显示)这反过来意味着你返回的HTTP请求代码必须在外部调用onCreate 方法。

【讨论】:

  • 对不起,我不知道什么是WebService,也不知道什么是override方法。谢谢。
  • WebService 是一个抽象类,它调用一个 AsyncTask,一旦完成,它会调用webServiceCallComplete,您可以关闭对话框。或者,使用加载ProgressDialog,运行线程来完成工作并使用处理程序调用runnable 来关闭对话框并使用返回值执行您想要的操作。
  • 好的,我明白了。我编辑了我的问题,因为它更多的是在显示 ProgressDialog 时阻止 UI 线程等待结果。完成后关闭对话框并使用获取的结果“恢复”创建。
  • 我了解您的问题。当你没有实现Runnable 时,ProgressDialog 不会出现,因为(我想你知道)HTTP 请求是在同一个线程上调用的,所以它会在不显示 ProgressDialog 的情况下处理它。我不认为您真的想在实际的onCreate 方法本身上继续您的代码。您将从那里调用它,并且您的 Handler 将在 onCreate 方法之外调用可运行对象,但这并不重要。当您阻塞线程时,您不能等待回复并在 onCreate 方法中同时显示对话框。您必须调用处理程序。
  • 更新了我的答案,希望对您有所帮助。
【解决方案2】:

在您的oncreate 中显示dialog first,然后创建一个thread 并在那里执行您的http task,一旦您完成了该操作,请从线程中调用handler,并在您的对话框中调用dismiss

【讨论】:

  • 通过将对话框放在 Runnable 类中,它与我的解决方案一样好。谢谢。
猜你喜欢
  • 2011-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2023-03-29
相关资源
最近更新 更多