10

Bu bağlantıyı bakarak benim android projede MVP desen uygulamak çalışıyorum: https://github.com/jpotts18/android-mvpAndroid'de MVP kalıbını kullanırken android servis çağrıları ve GoogleAPIClient çağrıları nereye yazılmalıdır?

başarıyla görünümü/sunucu/Interactor sınıfları uyguladık. Ben

  • net değilim nerede service çağrı kodu koymak? i sunucu veya uygulayıcı sınıf içinde bağlamı alınamıyor yana

, ben

  • Nerede GoogleApiClient sınıfını uygulamak için oraya service aramayı beklemeye mümkün değilim? GoogleApiClient yana

da o da Ben de ilk soruya arıyorum bir bağlamda

cevap

6

Hançeri kullanmak, Sunucunuzdaki Interactor'ı enjekte etmeyi kolaylaştırır. Bu bağlantıyı deneyin (https://github.com/spengilley/AndroidMVPService)

Bunu hantal olmadan gerçekleştirmeye çalışıyorum. Ancak bu MVP mimarisini ihlal ediyor gibi görünüyor.

Etkinlikten, Interactor'ın bir örneğini oluşturdum. Ardından, Interactor ile Presenter örneğini parametrelerden biri olarak oluşturun.

Aktivite

public class SomeActivity extends Activity implements SomeView { 
    private SomePresenter presenter; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     SomeInteractor interactor = new SomeInteractorImpl(SomeActivity.this); 
     presenter = new SomePresenterImpl(interactor,this); 
    } 

    @Override 
    protected void onStart() { 
    super.onStart(); 
    presenter.startServiceFunction(); 
    } 

Sunum

public interface SomePresenter { 
    public void startServiceFunction(); 
} 

Sunum Uygulama

public class SomePresenterImpl implements SomePresenter { 
    private SomeInteractor interactor; 
    private SomeView view; 
    public SomePresenterImpl(SomeInteractor interactor,SomeView view){ 
     this.interactor = interactor; 
     this.view = view; 
    } 
    @Override 
    public void startServiceFunction() { 
     interactor.startServiceFunction(); 
    } 
} 

İnteraktör

public interface SomeInteractor { 
    public void startServiceFunction(); 
} 

İnteraktör İmplementasyonu geri aramalar `GoogleApiClient.ConnectionCallbacks` ve` GoogleApiClient işlemek nasıl

public class SomeInteractorImpl implements SomeInteractor { 
    private Context context; 

    public SomeInteractorImpl(Context context) { 
     this.context = context; 
    } 

    @Override 
    public void startServiceFunction() { 
     Intent intent = new Intent(context, SomeService.class); 
     context.startService(intent); 
    } 
} 
+3

Cevabın doğru olduğunu düşünmüyorum. Uygulayıcı, belirli çerçeveler hakkında hiçbir şey bilmemeli ve Temiz Mimari [link] 'den (https://blog.8thlight.com/uncle-bob/2012/08/13/the-clean) yönergeleri izlerseniz Android agnostik olmalıdır. -architecture.html). Bu nedenle, İçerik sınıfı da dahil olmak üzere Android ile ilgili herhangi bir şeyden tamamen arınmış olmalıdır. – koufa

+0

@koufa 'Context' _somewhere_ koymalısınız. Bir "Hizmet" ile başka nasıl etkileşim kuracaksınız? Ne önerirsiniz? – AutonomousApps

+2

@AutonomousApps Uygulamanızı katmanlara bölerseniz, Interactor'ler Domain Layer'da yer alır. Bu Katman, Android bağımlılığı olmayan herhangi bir çerçeveye bağlı bağımlılığa sahip olmamalıdır. 'Servis' başlatması bu kodu sardığınız DataLayer'a gitmelidir. 'Intent intent = new Intent (context, SomeService.class); context.startService (intent); 'Etki Alanı Katmanı'ndan bir arabirim uygulayan bir sınıfta. Ardından, Interactor sadece bu arabirimi bilecek ve bunun somut uygulanmasından haberdar olmayacaktır. – koufa

0

olmadan sunucu veya etkileşimi hizmetine içine uygulanması olamaz, çalıştırmak için bağlam gerektirir. Ancak, ikinci sorunun cevabını aldım.

Cevap Hançer2. (http://google.github.io/dagger/) Hançer2'yi kullanarak GoogleApiClient nesnesini kolayca enjekte edebilirsiniz.

+7

.DI kullanırken OnConnectionFailedListener'? Bir örnek faydalı olacaktır. – sidecarcat