10

Tôi cố gắng để thực hiện MVP mẫu trong dự án Android của tôi bằng cách tham khảo liên kết này: https://github.com/jpotts18/android-mvpCác cuộc gọi và cuộc gọi dịch vụ Android đến GoogleAPIClient ở đâu nên được viết khi sử dụng mẫu MVP trong Android?

tôi đã triển khai thành công xem/người dẫn chương trình/trình tương tác lớp. Tôi không rõ ràng trên

  • Nơi để đặt mã gọi service?

Kể từ khi tôi không thể có được bối cảnh bên trong người dẫn chương trình hoặc trình tương tác lớp, tôi không thể để đưa service cuộc gọi có

  • ở đâu để thực hiện các lớp GoogleApiClient?

Kể từ GoogleApiClient cũng đòi hỏi bối cảnh để chạy, nó cũng có thể không được thực hiện bên trong người dẫn chương trình hoặc trình tương tác mà không có một bối cảnh

Trả lời

6

Sử dụng dao găm làm cho việc đưa Interactor vào Trình bày của bạn dễ dàng hơn. Hãy thử liên kết này (https://github.com/spengilley/AndroidMVPService)

Tôi đang cố gắng đạt được điều đó mà không cần dao găm. Nhưng điều này có vẻ vi phạm kiến ​​trúc MVP.

Từ Hoạt động, tôi đã tạo một phiên bản của Interactor. Sau đó tạo cá thể của Người trình bày với Interactor làm một trong các tham số.

Hoạt động

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(); 
    } 

Presenter

public interface SomePresenter { 
    public void startServiceFunction(); 
} 

Presenter Thực hiện

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(); 
    } 
} 

INteractor

public interface SomeInteractor { 
    public void startServiceFunction(); 
} 

INteractor Thực hiện

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

Tôi không nghĩ câu trả lời là đúng. Người tương tác không nên biết bất kỳ điều gì về các khung công tác cụ thể và phải là bất khả tri của Android nếu bạn làm theo hướng dẫn từ [Kiến trúc sạch] [link] (https://blog.8thlight.com/uncle-bob/2012/08/13/the-clean -architecture.html). Do đó, nó hoàn toàn không có bất kỳ thứ gì liên quan đến Android bao gồm cả lớp Ngữ cảnh. – koufa

+0

@koufa bạn phải đặt 'Context' _somewhere_. Bạn sẽ tương tác với một dịch vụ khác như thế nào? Bạn muốn giới thiệu gì? – AutonomousApps

+2

@AutonomousApps Nếu bạn chia ứng dụng của mình thành các lớp thì các Trình tương tác sẽ nằm trong Lớp Miền. Lớp này không nên có bất kỳ phụ thuộc khung cụ thể nào có nghĩa là không phụ thuộc vào Android. Việc khởi tạo 'Service' sẽ đi đến DataLayer nơi bạn quấn mã này' Intent intent = new Intent (context, SomeService.class); context.startService (intent); 'trong một lớp thực hiện giao diện từ Lớp Miền. Sau đó, các Interactor sẽ chỉ biết về giao diện này và không phải về việc thực hiện cụ thể của nó. – koufa

0

Tôi cũng đang tìm kiếm câu hỏi đầu tiên của bạn. Tuy nhiên, tôi có câu trả lời cho câu hỏi thứ hai.

Câu trả lời là Dagger2. (http://google.github.io/dagger/) Bạn có thể dễ dàng tiêm đối tượng GoogleApiClient bằng cách sử dụng Dagger2.

+7

Làm thế nào để bạn xử lý các callbacks 'GoogleApiClient.ConnectionCallbacks' và' GoogleApiClient.OnConnectionFailedListener' khi sử dụng DI? Một ví dụ sẽ hữu ích. – sidecarcat

Các vấn đề liên quan