3

RoboSpice を使用して、サーバーからの JSON 回答を受信して​​処理しています。私は RoboSpice チュートリアルのようにすべて作成しました: AndroidManifest.xml にサービス (NetworkSpiceService) を追加し、必要なライブラリを追加し、特別な応答オブジェクトを実装しました - SimpleResponse with @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());
    }

}

NetworkManager クラス:

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 リクエストを他の方法で処理する必要があるのでしょうか?

4

2 に答える 2

0

@Take Chances Make Cha が言ったように、load の呼び出しは表示されません。リクエスト リスナーのメソッド (少なくとも 2 つのうちの 1 つ) をトリガーする必要があります。

Android での Https の処理は、サーバーの証明書が Android のものでないとわかりにくくなる可能性がありますが、これは RS とは関係ありません。これは、より一般的な Android の動作方法です。

とにかく、ログを確認してください。RS は多くのログを記録します。リクエストが処理されているかどうか、何が起こっているかがわかります。また、リスナーへのすべての呼び出しがログに記録されます。

ところで、NetworkManager 静的ファクトリ メソッドを削除し、共通コード (定数も含む) を処理するためのリクエストの継承を作成します。このようなファクトリは良い設計ではありません。たとえば、モックを作成することは不可能であり、テストが難しくなります。

于 2013-10-11T09:10:30.020 に答える