当前位置: 首页 > 知识库问答 >
问题:

如何为MVVM模式链接referfit和repository/viewModel?

贺雪松
2023-03-14

我有麻烦链接改型与MVVM架构。实际上,在阅读了只讨论用于SQLite本地数据库的Room的文档后,我搜索了同样的内容,但搜索了来自Rest服务器的数据。所以,我尝试做了类似的事情,但没有成功:https://proandroiddev.com/mvvm-architecture-viewmodel-and-livedata-part-1-604f50cda1

我有一个观察ViewModel的活动:

mFlightPlanViewModel = ViewModelProviders.of(this).get(FlightPlanViewModel.class);
        mFlightPlanViewModel.getFlightPlans().observe(this, (flightPlans) -> {
            Log.d(TAG, "ON_CHANGED");

            mFlightPlanAdapter.setFlightPlans(flightPlans);
        });
public class FlightPlanViewModel extends AndroidViewModel {
    private static final String TAG = "FlightPlanViewModel";

    private LiveData<List<FlightPlan>> mFlightPlans;
    private FlightPlanRepository mFlightPlanRepository;

    public FlightPlanViewModel(@NonNull Application application) {
        super(application);
        Log.d(TAG, "CONSTRUCTOR");

        mFlightPlanRepository = FlightPlanRepository.getInstance();
        mFlightPlans = mFlightPlanRepository.getFlightPlans();
    }

    public LiveData<List<FlightPlan>> getFlightPlans() {
        Log.d(TAG, "GET_FLIGHT_PLANS");

        return mFlightPlans;
    }
}
public class FlightPlanRepository {
    private static final String TAG = "FlightPlanRepository";

    private static FlightPlanRepository instance;
    private RestApi mRestApi;

    private FlightPlanRepository() {
        Log.d(TAG, "CONSTRUCTOR");

        mRestApi = RestDao.getRestDao();
    }

    public static FlightPlanRepository getInstance() {
        Log.d(TAG, "GET_INSTANCE");

        if (instance == null) {
            instance = new FlightPlanRepository();
        }
        return instance;
    }

    public MutableLiveData<List<FlightPlan>> getFlightPlans() {
        Log.d(TAG, "GET_FLIGHT_PLANS");

        final MutableLiveData<List<FlightPlan>> data = new MutableLiveData<>();

        mRestApi.getFlightPlanList().enqueue(new Callback<List<FlightPlan>>() {
            @Override
            public void onResponse(Call<List<FlightPlan>> call, Response<List<FlightPlan>> response) {
                if (response.code() == 200) {
                    List<FlightPlan> temp = response.body();
                    for (FlightPlan flightPlan : temp) {
                        Log.d(TAG + "res", flightPlan.toString());
                    }
                    data.setValue(response.body());
                    Log.d(TAG + "res", response.toString());
                }
            }

            @Override
            public void onFailure(Call<List<FlightPlan>> call, Throwable t) {
                List<FlightPlan> flightPlans = new ArrayList<>();
                flightPlans.add(new FlightPlan(0, "Test", 3.551, 50.52, 3.55122, 50.52625));
                data.setValue(flightPlans);
                Log.d(TAG, t.getMessage());
            }
        });

        return data;
    }
}

存储库使用一个改型实例:

public class RestDao {
    private static final String BASE_URL = "http://192.168.1.78:8080";
    private static Retrofit instance;

    private static Retrofit getInstance() {
        if (instance == null) {
            instance = new Retrofit.Builder()
                    .baseUrl(BASE_URL)
                    .addConverterFactory(GsonConverterFactory.create())
                    .build();
        }
        return instance;
    }

    public static RestApi getRestDao() {
        return getInstance().create(RestApi.class);
    }
}

它使用这个接口:

public interface RestApi {
    @GET("/plan/list")
    Call<List<FlightPlan>> getFlightPlanList();
}

代码中不起作用的部分是:

public MutableLiveData<List<FlightPlan>> getFlightPlans() {
    Log.d(TAG, "GET_FLIGHT_PLANS");

    final MutableLiveData<List<FlightPlan>> data = new MutableLiveData<>();

    mRestApi.getFlightPlanList().enqueue(new Callback<List<FlightPlan>>() {
        @Override
        public void onResponse(Call<List<FlightPlan>> call, Response<List<FlightPlan>> response) {
            if (response.code() == 200) {
                List<FlightPlan> temp = response.body();
                for (FlightPlan flightPlan : temp) {
                    Log.d(TAG + "res", flightPlan.toString());
                }
                data.setValue(response.body());
                Log.d(TAG + "res", response.toString());
            }
        }

        @Override
        public void onFailure(Call<List<FlightPlan>> call, Throwable t) {
            List<FlightPlan> flightPlans = new ArrayList<>();
            flightPlans.add(new FlightPlan(0, "Test", 3.551, 50.52, 3.55122, 50.52625));
            data.setValue(flightPlans);
            Log.d(TAG, t.getMessage());
        }
    });

    return data;
}

共有1个答案

寿鸣
2023-03-14

嘿,Kevin,只是对代码的一个小改动。从存储库返回LiveData而不是MutableLiveData:

public LiveData<List<FlightPlan>> getFlightPlans() {
    Log.d(TAG, "GET_FLIGHT_PLANS");

    final MutableLiveData<List<FlightPlan>> data = new MutableLiveData<>();

    mRestApi.getFlightPlanList().enqueue(new Callback<List<FlightPlan>>() {
        @Override
        public void onResponse(Call<List<FlightPlan>> call, Response<List<FlightPlan>> response) {
            if (response.code() == 200) {
                List<FlightPlan> temp = response.body();
                for (FlightPlan flightPlan : temp) {
                    Log.d(TAG + "res", flightPlan.toString());
                }
                data.postValue(response.body());
                Log.d(TAG + "res", response.toString());
            }
        }

        @Override
        public void onFailure(Call<List<FlightPlan>> call, Throwable t) {
            List<FlightPlan> flightPlans = new ArrayList<>();
            flightPlans.add(new FlightPlan(0, "Test", 3.551, 50.52, 3.55122, 50.52625));
            data.postValue(flightPlans);
            Log.d(TAG, t.getMessage());
        }
    });

    return data;
}
 类似资料:
  • 我正在一个图片库网站上工作,我认为拥有模态图片将是一个很好的补充。在w3schools指南和其他一些资源的帮助下,我成功地为我的规范创建了工作模式图像。然而,我也希望在模式中的标题的后半部分在单击时作为指向另一个页面的链接,但我无法让它工作。 w3schools的JavaScript根据所讨论图像的属性中的文本添加标题。但是,由于它已经是一个属性,因此我无法将标题的后半部分用

  • 我正在尝试使用引导模式http://twitter.github.com/bootstrap/javascript.html#modals在rails链接上,在模式中打开该链接 但不知何故,它不起作用。标准切换代码为- 但我不知道如何将其应用于rails中的链接,有什么帮助吗? 谢谢

  • 我正在尝试用MVVM模式的登录活动创建一个初始屏幕。我的闪屏确实工作得很好,但当它试图完成并启动LoginActivity时,应用程序崩溃了。我得到如下错误。 请帮我解决这个问题。我需要在我的项目中有一个slapsh屏幕,其中包含MVVM模式和LoginActive的房间db。非常欢迎解释或代码示例。 我的Splash活动 我的登录活动 我的登录查看模型 我得到的错误 E/AndroidRunti

  • 根据http://json-schema.org/和jsonSchema中提供的示例,json shema使用的格式包括链接 但是我找不到一种方法把它添加到生成的,schema,虽然有一个HyperSchema对象,这似乎是我需要的,但是我找不到如何使用它。

  • Web多链接合并试验过程 在创建和编辑试验时,建议使用Chrome浏览器,以达到最佳体验。 在这部分中,我们以对比两个不同页面布局,获取最优点击率为例,来说明如何使用H5多链接合并模式。 1 试验方案 一个完整的A/B 测试需要根据目前已有的用户数据进行分析判断,推断并建立假设,才能针对性的做出改变和调整,根据具体需求,构建产品A/B 测试的需求文档,即明确本次试验的几个要素。 2 新建试验 进入

  • 问题内容: 我目前从事WPF的大量开发工作,并已开始创建一些基本的Android应用程序。在创建WPF应用程序时,我经常使用MVVM,通常使用Prism,并且想知道是否有针对Android平台的MVVM的示例? 问题答案: 我是Android- Binding 的开发人员。就像@Brentley所说的,这是一个非常新的项目,但我确实希望获得更多的嗡嗡声和经验,以便对其进行改进。回到您的问题,我编写