如何在Retrofit Callback中调用intent?

时间:2014-09-04 12:11:06

标签: android android-intent android-activity retrofit

我想在Retrofit调用的WebService成功回调中显示一个新活动。 我很难找到有关如何使用Retrofit回调结果来启动新活动的示例。 这是一个很好的方法吗?我以前需要清理一些东西吗?

public void validate(View view) {
    RetrofitWebServices.getInstance().webserviceMethod(params,new Callback<MyObject>() {
        @Override
        public void success(MyObject object, Response response) {
            Intent barIntent = new Intent(FooActivity.this, BarActivity.class);
            startActivity(barIntent);
        }

        @Override
        public void failure(RetrofitError error) {
            ...
        }
    });
}

2 个答案:

答案 0 :(得分:8)

您可以使用弱引用Callback

来实施Context
public class MyCallback implements Callback<MyObject> {

    WeakReference<Context> mContextReference;

    public MyCallback(Context context) {
        mContextReference = new WeakReference<Context>(context);
    }

    @Override
    public void success(MyObject arg0, Response arg1) {
        Context context = mContextReference.get();
        if(context != null){
            Intent barIntent = new Intent(FooActivity.this, BarActivity.class);
            context.startActivity(barIntent);
        } else {
            // TODO process context lost
        }
    }

    @Override
    public void failure(RetrofitError arg0) {
        // TODO process error
    }

}  

请记住 - 如果在执行请求期间Context丢失,此解决方案将无效,但您可能不担心潜在的内存泄漏,如果您继续强烈引用Context对象

答案 1 :(得分:2)

您有一个似乎更容易的解决方案:使用getApplicationContext()函数。

我不是100%确定它没问题,但在我的情况下它按预期工作。

您的代码将是:

public void validate(View view) {
    RetrofitWebServices.getInstance().webserviceMethod(params,new Callback<MyObject>() {
        @Override
        public void success(MyObject object, Response response) {
            Intent barIntent = new Intent(getApplicationContext(), BarActivity.class);
            startActivity(barIntent);
        }

        @Override
        public void failure(RetrofitError error) {
            ...
        }
    });
}