2013-10-07 171 views
3

说我想从服务器执行一个Http请求,这个过程需要时间。android等待服务器响应

现在正因为如此,在HTTP请求需要在不同的线程(的AsyncTask,可运行等)

运行,但有时我需要的只是响应当我问它,以更新UI

在循环中使用的Thread.sleep等待响应不好的表现明智

例如:我想用户的名字,我向服务器请求它,我必须等待它 现在该活动调用UserManager,该UserManager调用执行该操作的serverHandler并将结果返回

也许事件系统是为了,但我不知道怎样在我之情况 做到这一点,很坦率地说,我真的很困惑这个问题上

请帮助别人?

+1

什么用的AsyncTask的问题。它会为你做到这一点 – stinepike

+0

异步任务将很容易,如果我要从活动中完成,然后在完成时更新UI,但是我的系统比较复杂,而且它有层(activity-> UserManager- > ServerHandler) –

+0

与系统其余部分的GUI分离是在这种情况下让我感到困惑,并且使我更难以弄清楚 –

回答

6

这可以最肯定做瓦特/的AsyncTask ......在处理的doInBackground()网络请求,一旦doInBackground()完成后,将触发在UI线程onPostExecute()那就是你可以执行将更新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,检查是否回调为null,并调用适当的方法。

    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

+0

究竟..只有一件事我才批准你的答案......这意味着我必须为每一个不同的要求写不同的事件? –

+0

不,你不需要。如果您向两个不同的端点发出Http请求,则可以使用相同的回调。唯一不同的是你需要做的是实现一些逻辑来区分两者之间的差异。就像使用请求ID或类似的东西一样。 –

+0

是的,这就是我做了部分,很酷,非常感谢 –

相关问题