首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RoboSpice。RequestListener不会触发

RoboSpice。RequestListener不会触发
EN

Stack Overflow用户
提问于 2013-08-08 17:48:19
回答 2查看 1.2K关注 0票数 3

我正在使用RoboSpice来接收和处理来自服务器的JSON应答。我在RoboSpice教程中做了所有类似的事情:在AndroidManifest.xml中添加了服务(NetworkSpiceService),添加了必要的库,使用@JsonIgnoreProperties(ignoreUnknown = true)实现了一个特殊的响应对象- SimpleResponse。

基础活动:

代码语言:javascript
复制
public abstract class BaseActivity extends Activity {

private SpiceManager spiceManager = new SpiceManager(NetworkSpiceService.class);
@Override
protected void onStart() {
    spiceManager.start(this);
    super.onStart();
}

@Override 
protected void onStop() {
    spiceManager.shouldStop();
    super.onStop();
}

public SpiceManager getSpiceManager() {
    return spiceManager;
}

}

我的工作活动:

代码语言:javascript
复制
public class MainActivity extends BaseActivity implements OnClickListener{
private static final String JSON_CACHE_KEY = "some_json";
private Button button1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // ...
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}


private void load() {
    getSpiceManager().execute(NetworkManager.getJson(param), JSON_CACHE_KEY, DurationInMillis.ALWAYS_EXPIRED, new JsonRequestListener());
}

private class JsonRequestListener implements RequestListener<SimpleResponse> {


    @Override
    public void onRequestFailure(SpiceException spiceException) {
        Log.e("Json", "failure: " + spiceException.getMessage());
    }

    @Override
    public void onRequestSuccess(SimpleResponse simpleResponse) {
        Log.i("Json", "response");
        Log.i("Json", "response received. offset = " +  simpleResponse.getOffset() + " timezone = " + simpleResponse.getTimeZone());
    }

}

NetwokManager类:

代码语言:javascript
复制
public class NetworkManager {
private static final String API_KEY = ".....";
private static final String GET_SOME_URL = "https://api.servername.com/" + API_KEY + "/";

public static GetRequest<SimpleResponse> getJson(double param) {

    return new  GetRequest<SimpleResponse>(SimpleResponse.class, GET_SOME_URL + param);

}

}

和GetRequest:

代码语言:javascript
复制
public class GetRequest<T extends SimpleRequest> extends
    SpringAndroidSpiceRequest<T> {
private Class<T> clazz;
private String url;



public GetRequest(Class<T> clazz, String url) {
    super(clazz);
    this.clazz = clazz;
    this.url = url;
}


@Override
public T loadDataFromNetwork() throws Exception {
    return getRestTemplate().getForObject(url, clazz);
}

因此,在调用load()之后,我应该触发OnRequestFailure(...)或者onRequestSuccess(...),但是什么都没有。我确信是loadDataFromNetwork打来的。在浏览器上,我收到了对该地址的响应,但不是在我的应用程序中。

出什么问题了?是不是我忘了什么?或者https请求是否需要以其他方式处理?

EN

回答 2

Stack Overflow用户

发布于 2013-10-02 03:46:52

在哪里调用private void load()?如果它是ClickListener的一部分,你应该没问题。如果它是onCreate()中的一个方法,那么您可能会遇到问题,因为RoboSpice尚未“启动”并且未绑定,因此您的请求可能会排队等待执行,并被忽略或返回,而没有引用您的侦听器。

尝试在您的SpiceService实现中覆盖protected RequestListenerNotifier createRequestRequestListenerNotifier(),并在您的DefaultRequestListenerNotifier实现中抛出一堆断点进行调试,以检查调用的问题。

票数 0
EN

Stack Overflow用户

发布于 2013-10-11 17:10:30

正如@Take of Cha所说的那样,我们没有看到你调用load。它应该触发请求监听器的方法,至少两者中的一个。

如果服务器的证书不知道Android,那么Https在Android中的处理可能会变得棘手,但这与RS无关。这是一种更通用的Android工作方式。

无论如何,多检查你的日志,RS日志,它会告诉你发生了什么,你的请求是否被处理了,它会记录所有对监听器的调用。

顺便说一句,删除NetworkManager静态工厂方法,创建一个继承的请求来处理公共代码(甚至常量)。这样的工厂不是一个好的设计,例如,它将不可能模拟,并将使测试变得更加困难。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18122852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档