Android 如何在改装回调中调用意图?

Android 如何在改装回调中调用意图?,android,android-intent,android-activity,retrofit,Android,Android Intent,Android Activity,Retrofit,我想在我的Web服务的成功回调上显示一个新的活动,名为Reformation。 我很难找到关于如何使用翻新回调结果来启动新活动的示例。 这是一个好方法吗?我需要先清理一些东西吗 public void validate(View view) { RetrofitWebServices.getInstance().webserviceMethod(params,new Callback<MyObject>() { @Override public

我想在我的Web服务的成功回调上显示一个新的活动,名为Reformation。 我很难找到关于如何使用翻新回调结果来启动新活动的示例。 这是一个好方法吗?我需要先清理一些东西吗

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) {
            ...
        }
    });
}
public void验证(视图){
改型Webservices.getInstance().webserviceMethod(参数,新回调(){
@凌驾
public void成功(MyObject对象、响应){
Intent barIntent=新的Intent(FooActivity.this、BarActivity.class);
星触觉(barIntent);
}
@凌驾
公共无效失败(错误){
...
}
});
}

您可以通过弱引用
上下文来实现
回调

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
    }

}  
公共类MyCallback实现回调{
WeakReference mContextReference;
公共MyCallback(上下文){
mContextReference=新的WeakReference(上下文);
}
@凌驾
公共无效成功(MyObject arg0,响应arg1){
Context=mContextReference.get();
if(上下文!=null){
Intent barIntent=新的Intent(FooActivity.this、BarActivity.class);
背景。开始触觉(barIntent);
}否则{
//TODO进程上下文丢失
}
}
@凌驾
公共无效失败(错误arg0){
//TODO进程错误
}
}  

请记住-如果在请求过程中发生
上下文
丢失,此解决方案将不起作用,但如果您保持对
上下文
对象的强引用,您可能不担心潜在的内存泄漏。

我有一个似乎更简单的解决方案:使用
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) {
            ...
        }
    });
}
public void验证(视图){
改型Webservices.getInstance().webserviceMethod(参数,新回调(){
@凌驾
public void成功(MyObject对象、响应){
Intent-barIntent=newintent(getApplicationContext(),BarActivity.class);
星触觉(barIntent);
}
@凌驾
公共无效失败(错误){
...
}
});
}

谢谢。我所有的webservices调用都使用这种模式。但这是正确的方法吗?在android中,它总是必须是一个异步调用吗?因为android强制您在单独的线程中执行网络请求,所以这个机制总是异步的——显式或隐式的。通过改型,您可以实现同步(使用返回值)和异步流(使用回调)。请记住,在第一种情况下,您必须自己处理线程。我不能保证这种回调方法是实现您的目标的最佳方法,但恐怕没有绝对可靠且安全的方法可以让您保持上下文引用的活动性。