2014-10-21 71 views
0

今天我只是做对改造一些研究,通过我们自己的杰克·沃顿,所以我做了这样的事情Android:Retrofit异步执行回调成功和失败?

RetroClass.getClient().getSomeData(param, new Callback<Model>(){ 

@Override 
public void failure(...){/*blah*/} 

@Override 
public void success(Model response, Response notUsed) 
{ 
try 
{ 
    Thread.sleep(10000); 
} 
catch(Exception e){e.pST();} 
}}); 

我期望的ANR,但流程执行精细,杰克沃顿在此提到的发布 Does Retrofit make network calls on main thread? “正如在回答指出,如果你使用第二个模式(最后一个参数作为回调)该请求是异步的,但回调被调用的主线程上。默认情况下,改造使用这些请求的线程池“。

,早在主线程上执行调用,发生了什么在这里,任何见解?为什么不在这里导致一个ANR Thread.sleep()?? Im困惑......

回答

2

是的默认Android平台的CallbackExecutor使用的是MainThreadExecutor

确保通过做这样的事情

RestAdapter restAdapter = new RestAdapter.Builder() 
      .setExecutors(new MyHttpExecuter(), new MyCallbackExecutor()) { // watch out for this 
      .build() 

创建RestAdapter时,如果您覆盖默认CallbackExecutor通过设置自己的,那么你不会得到默认的行为你不重写默认实现。

+0

其几乎像创建一个新线程吧?除了你正在使用Executor ..而不是显式调用新线程(new(ThreadRunnable()))并启动它? – uLYsseus 2014-10-21 22:40:49

+0

其实我的答案似乎不是解决您的问题。在不重写默认回调,则情况下,你可以使用MainThreadScheduler这意味着从回调中完成任何阻塞'onSuccess'或'onFailure'会阻止用户界面。即使你实际上没有获得ANR,你也应该测试一下,看看你可能会注意到当你的回调执行时UI被阻塞了。你甚至可以把一个断点在'onSuccess'回调,并期待在其中它正在使用你的IDE执行的线程。 – 2014-10-21 23:05:00

+0

是的!执行者接口提供从如何每个任务将要运行的机制,包括线程使用,调度等http://docs.oracle.com/javase/7/docs/api/java的细节解耦任务提交的方式/util/concurrent/Executor.html – 2014-10-21 23:26:37