2014-09-04 64 views
4

我想在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) { 
      ... 
     } 
    }); 
} 

回答

7

你可以用弱引用實現CallbackContext

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對象的強烈參考。

+0

謝謝。我使用這種模式來處理所有的webservice調用。但是,它是正確的方式嗎?它總是必須是在android中的異步調用? – Labe 2014-09-04 15:28:24

+0

由於Android強制您在單獨的線程中執行網絡請求,因此此機制將始終是異步的 - 顯式或隱式。使用Retrofit可以實現同步(使用返回值)和異步流(使用回調)。只要記住 - 在第一種情況下,你必須自己照顧線程。我不能保證這種回調方式是實現您的目標的最佳方式,但恐怕沒有絕對可靠和防泄漏的方法,可以讓您保持上下文參考。 – Viacheslav 2014-09-05 09:43:09

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) { 
      ... 
     } 
    }); 
}