Https 机器人世界。RequestListener不会开火

Https 机器人世界。RequestListener不会开火,https,robospice,Https,Robospice,我正在使用RoboSpice接收和处理来自服务器的JSON应答。我在RoboSpice教程中做了类似的事情:在AndroidManifest.xml中添加了服务(NetworkSpiceService),添加了必要的libs,实现了一个特殊的响应对象——SimpleResponse和@JsonIgnoreProperties(ignoreUnknown=true) 基本活动: public abstract class BaseActivity extends Activity { priva

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

基本活动:

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;
}
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());
    }

}
}

我的工作活动:

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;
}
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());
    }

}
public类MainActivity扩展BaseActivity实现OnClickListener{
私有静态最终字符串JSON\u CACHE\u KEY=“some\u JSON”;
私人按钮1;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// ...
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为菜单充气;这会将项目添加到操作栏(如果存在)。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
专用空心荷载(){
getSpiceManager().execute(NetworkManager.getJson(param),JSON_缓存_键,DurationInMillis.ALWAYS_过期,新的JsonRequestListener());
}
私有类JsonRequestListener实现RequestListener{
@凌驾
公共void onRequestFailure(SpiceException){
Log.e(“Json”,“失败:”+spiceException.getMessage());
}
@凌驾
请求成功时公共无效(SimpleResponse SimpleResponse){
Log.i(“Json”、“响应”);
Log.i(“Json”,“response received.offset=“+simpleResponse.getOffset()+”时区=“+simpleResponse.getTimeZone());
}
}
NetwokManager类:

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);

}
公共类网络管理器{
私有静态最终字符串API_KEY=“…”;
私有静态最终字符串GET_SOME_URL=”https://api.servername.com/“+API_键+”/”;
公共静态GetRequest getJson(双参数){
返回新的GetRequest(SimpleResponse.class,GET_SOME_URL+param);
}
}

和获取请求:

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);
}
公共类GetRequest扩展
春之旅{
私人课堂;
私有字符串url;
公共GetRequest(类clazz,字符串url){
超级(clazz);
this.clazz=clazz;
this.url=url;
}
@凌驾
public T loadDataFromNetwork()引发异常{
返回getRestTemplate().getForObject(url,clazz);
}
因此,在调用load()之后,我希望在请求失败(…)或请求成功(…)时触发,但什么都没有。我确信loadDataFromNetwork正在调用。在浏览器上,我收到了该地址的响应,但在我的应用程序中没有


怎么了?可能是我忘了什么?或者可能是https请求需要以其他方式处理?

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


尝试重写受保护的RequestListenerNotifier CreateRequestListenerNotifier()在您的
SpiceService
实现中,并在
DefaultRequestListenerNotifier
实现中抛出一组断点进行调试,以检查调用情况。

正如@Take Chances Make Cha所说,我们没有看到您调用load。它应该触发您的请求侦听器方法,至少一个of两个

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

不管怎样,经常检查你的日志,RS日志,它会告诉你发生了什么,你的请求是否被处理,它会记录所有对侦听器的调用

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