Android-具有LiveData组件的MVVM和存储库中的Retrofit调用

时间:2018-10-18 13:24:00

标签: android retrofit repository-pattern android-livedata

我想在身份验证视图(登录)中使用以下组件:

  • MVVM
  • LiveData
  • 改造
  • 存储库

我不知道如何将Repository类中的异步Retrofit调用接收到当前的ViewModel。

视图-> ViewModel->具有LiveData的存储库。

有人会想到一个例子吗?

2 个答案:

答案 0 :(得分:5)

您可以按照以下步骤操作:

YourActivity.kt

n -> n

MyViewModel.kt

class YourActivity : AppCompatActivity() {

private val myViewModel by lazy {
    return@lazy ViewModelProviders.of(this).get(MyViewModel::class.java) }
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onViewReady(savedInstanceState)
    myViewModel.callApi() // You can do it anywhere, on button click etc..
    observeResponseData() // observe it once in onCreate(), it'll respect your activity lifecycle
}

private fun observeResponseData() {
    myViewModel.liveData.observe(this, Observer { data ->
        // here will be your response
    })
}
}

MyRepository.kt

class MyViewModel : ViewModel() {

val liveData = MutableLiveData<Your response type here>()
val myRepository = MyRepository()

fun callApi() {
    myRepository.callMyRetrofitApi(liveData)
}
}

尝试这样设置。

希望有帮助!

答案 1 :(得分:1)

使用LiveData和Retrofit在MVVM中设计项目的最简单方法是在ViewModel类中使用LiveData,在Repository中使用Retrofit。

用通俗易懂的话来说,您可以从存储库中的ViewModel类和ViewModel类中获取数据,然后将这些数据传递给 MutableLiveData ,然后可以通过转换该MutableLiveData在您的视图中进行观察进入LiveData。

MainActivity.java

public class MainActivity extends AppCompatActivity {
        private MainViewModel mainViewModel;

      @Override
      protected void onCreate(@Nullable Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_instruction);
                mainViewModel = ViewModelProviders.of(this).get(MainViewModel.class);
                mainViewModel.init();
                mainViewModel.getModelLiveData().observe(this, new Observer<MainResponse>() {
                @Override
                public void onChanged(@Nullable MainResponse mainResponse) {
                // Here you write logic which implements if the ViewModel data changes. 
             }}
         });
      }
    }

MainViewModel(您的ViewModel)

public class MainViewModel extends ViewModel {
private MainRepo mainRepo;
private MutableLiveData<MainResponse> modelMutableLiveData = new MutableLiveData<>();
Disposable disposable;

public MainViewModel() {
}

public MainViewModel(MainRepo mainRepo) {
    this.mainRepo = mainRepo;
}

public void init() {
                    modelMutableLiveData.setValue(mainRepo.callRetrofit().body());
                }

public LiveData<MainResponse> getModelLiveData() {
    return modelMutableLiveData;
   }
}

MainRepository(您的存储库类)

    public class MainRepository{

            public void callRetrofit() {
                    apiInterface = 
        ApiClient.getClient(ApiClient.POST_STATUS_URL).create(ApiInterface.class);
        Call<ModelForPostRequest> call = apiInterface.likeItem(modelForPostRequest);
        call.enqueue(new Callback<ModelForPostRequest>() {
        @Override
        public void onResponse(Call<ModelForPostRequest> call, 
                Response<ModelForPostRequest> response) {
            return response;
        }

        @Override
        public void onFailure(Call<ModelForPostRequest> call, Throwable t) {
        }
    });
}}