6

假设我想从服务器执行一个 Http 请求,这个过程需要时间。

现在正因为如此,http 请求需要在不同的线程上运行(AsyncTask、Runnable 等)

但有时我只需要在我要求时得到响应,以便更新 UI

在循环中使用 Thread.sleep 来等待响应在性能方面并不好

示例:我想要用户名,我向服务器询问它,现在我必须等待它 活动调用 UserManager 调用执行操作的 serverHandler 并返回结果

也许一个事件系统是有序的,但我不确定如何在我的场景中做到这一点,坦率地说,我对这个问题真的很困惑

请帮助某人?

4

1 回答 1

7

这绝对可以通过 AsyncTask 完成...处理网络请求doInBackground(),一旦doInBackground()完成,onPostExecute()就会在 UI 线程上触发,您可以在其中执行任何将更新 UI 元素的代码。

如果您需要一些更通用和可重用的东西,您可能想要实现回调......我将 UI 线程称为客户端,将 AsyncTask 称为服务器

  1. 创建一个新接口并创建一些方法存根。

    public interface MyEventListener {
        public void onEventCompleted();
        public void onEventFailed();
    } 
    
  2. 让您的客户端将 MyEventListener 的实例传递给服务器。执行此操作的典型方法是让您的客户端实现接口 (MyEventListener) 并将自身传递给服务器。

    public class MyActivity implement MyEventListener {
    
        public void startEvent() {
            new MyAsyncTask(this).execute();
        }           
    
        @Override
        public void onEventCompleted() {
            // TODO
        }
    
        @Override
        public void onEventFailed() {
            // TODO
        }
    }
    
  3. onPostExecute服务器上,检查回调是否为空并调用适当的方法。

    public class MyAsyncTask extends AsyncTask<Void, Void, Void> {
        private MyEventListener callback;
    
        public MyAsyncTask(MyEventListener cb) {
            callback = cb;
        }
    
        [...]
    
        @Override
        protected void onPostExecute(Void aVoid) {
            if(callback != null) {
                callback.onEventCompleted();
            }
        }
    }
    

您可以在此处阅读有关回调的更多信息:http ://www.javaworld.com/javaworld/javatips/jw-javatip10.html

于 2013-10-07T16:13:38.567 回答