我使用RoboSpice从服务器接收和处理JSON答案。我在RoboSpice教程中做了所有的事情:在AndroidManifest.xml中添加了服务(NetworkSpiceService),添加了需要的libs,实现了一个特殊的响应对象 - 带有@JsonIgnoreProperties的SimpleResponse(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());
}
}
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);
}
}
和GetRequest:
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请求需要以其他方式处理?
答案 0 :(得分:0)
你在哪里打private void load()
?如果它是ClickListener的一部分你应该没问题。如果它是onCreate()中的方法,则可能存在问题,因为RoboSpice尚未“启动”且未绑定,因此您的请求可能会排队等待执行,并且在没有引用您的侦听器的情况下被忽略或返回。
尝试在protected RequestListenerNotifier createRequestRequestListenerNotifier()
的实现中覆盖SpiceService
并在DefaultRequestListenerNotifier
的实现中调试一堆断点来检查调用的内容。
答案 1 :(得分:0)
作为@Take Chances让Cha说,我们没有看到你调用负载。它应该触发你的请求监听器的方法,至少是两个中的一个。
如果服务器的证书不知道Android,那么Android中的Https处理会变得棘手,但这与RS无关。这是一种更通用的Android工作方式。无论如何,检查你的日志,RS记录很多,它会告诉你发生了什么,如果你的请求被处理,它会记录所有对听众的调用。
BTW,删除NetworkManager静态工厂方法,创建处理公共代码(甚至常量)的请求继承。这样的工厂不是一个好的设计,例如不可能模拟并且会使测试更难。