【问题标题】:Android: Blocking RPC with progress dialogAndroid:使用进度对话框阻止 RPC
【发布时间】:2012-06-26 21:12:43
【问题描述】:

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

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

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

【问题讨论】:

    标签: android multithreading rpc


    【解决方案1】:

    你不能同时做这两个,让主线程在一个循环中等待并显示一个进度对话框,同时。主线程等待或显示对话框。

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

    【讨论】:

    • 我想阻塞主线程,因为如果调用是异步完成的(用户必须等待才能继续),我的应用程序没有任何好处,并且异步方法使程序逻辑很多更复杂。
    • 没那么复杂。它是当今几乎所有应用程序的一部分,因为大多数应用程序都使用网络。当您在后台的 AsyncTask 中获取数据时,让用户等待查看进度对话框..
    【解决方案2】:

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

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

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

    AsyncTask 是一个异步调用,因为您有 2 个线程同时工作,一个是显示进度对话框的 UI 线程,另一个是从服务器获取数据的非 UI 后台线程。

    希望这个解释有所帮助。

    【讨论】:

      【解决方案3】:

      我找到了一个似乎可行的解决方案(至少我还没有注意到任何问题)。我知道正确的方法是使用 AsyncTask 之类的东西,但就我而言,我没有从中受益,而且它使程序逻辑复杂化。

      在新线程中更新 UI:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多