2014-09-04 4 views
4

Я хочу показать новую активность при успешном обратном вызове моего WebService, вызванного Retrofit. И мне трудно найти примеры того, как использовать результат обратного вызова 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

Вы можете реализовать 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.

+0

Спасибо. Я использую этот шаблон для всех своих вызовов веб-сервисов. Но это правильный способ сделать это? Всегда ли это должен быть асинхронный вызов в Android? – Labe

+0

Поскольку Android заставляет выполнять сетевые запросы в отдельном потоке, этот механизм всегда будет асинхронным - явно или неявно. Используя Retrofit вы можете реализовать как синхронные (с использованием возвращаемого значения), так и асинхронный поток (используя обратные вызовы). Просто помните - в первом случае вы должны сами позаботиться о нарезке. Я не могу гарантировать, что этот подход обратного вызова является наилучшим способом достижения вашей цели, но я боюсь, что нет абсолютно надежного и надежного метода, который позволит вам сохранить контекстную ссылку вживую. – Viacheslav

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