gpt4 book ai didi

android - 如何使用 MVP 和 rxjava 构建我的应用程序并进行改造以从 Observables 中获取数据?

转载 作者:太空宇宙 更新时间:2023-11-03 10:18:44 25 4
gpt4 key购买 nike

因此,我会尽量让这个问题切题,但它会涉及遍历整个代码路径的代码 fragment 。

就上下文而言,我是相当新的 Android 开发人员并且完全是自学成才的,所以请在整个过程中通知我任何明显的误解/糟糕的组织。问题的主要焦点是我现在遇到的错误,即在网络请求之后,应该作为该网络请求的结果设置的变量为空,因为代码在网络请求完成之前向前移动.

这是我的 Activity 方法。它应该用 mUserPresenter.getUserList() 的结果填充 mFriends 变量,这是(不幸的)null:

/**
* Grabs a list of friends, populates list with UserAdapter
*/
@Override
public void onResume(){
super.onResume();
mUserPresenter = new UserPresenter();
mFriends = mUserPresenter.getUserList();
if (mGridView.getAdapter() == null) {
UserAdapter adapter = new UserAdapter(getActivity(), mFriends);
mGridView.setAdapter(adapter);
}
else{
((UserAdapter)mGridView.getAdapter()).refill(mFriends);
}

}

下面是我如何构建我的 UserPresenter 方法 getUserList:

public List<User> getUserList()
{
ApiService.get_friends(this);
return mUserList;
}

真正的魔法发生在 ApiService 类中:

public static void get_friends(final UserPresenter userPresenter){
ApiEndpointInterface apiService = prepareService();
apiService.get_friends().
observeOn(AndroidSchedulers.mainThread())
.subscribe(
new Action1<List<User>>()
{
@Override
public void call(List<User> users) {
userPresenter.setList(users);
}
}
);
}

我的想法是,通过在 ApiService 中调用 userPresenter.setList(users),会将 mUserList 设置为来自 api 的响应要求。但是,在 getUserList 响应时,mUserList == null

关于如何构建它的任何想法?

最佳答案

我也开始学习类似的东西。在这里,我宁愿使用回调。

在你的演示者中,

public void setList(List<User> users) {
yourView.setUserList(users);
}

以及实现 View (MVP) 的 Activity

@Override
public void setUserList(List<User> users) {
((UserAdapter)mGridView.getAdapter()).refill(mFriends);
}

此外,检查改造是否未返回空列表。

在学习这一切的过程中,我做了一个小应用程序。它从 GitHub 获取用户数据并显示在列表中。我也在使用 ORMLite 和 Picasso,所以那里有一些数据库的东西。也使用了 Dagger Dependency(但你可以忽略它)。这是 link .

这是我的 Presenter 的行为方式:

private DataRetrieverImpl dataRetriever;

@Override
public void getUserList(String name) {
dataRetriever.getUserList(name);
}

@Override
public void onEvent(DataRetrieverEvent event) {
UserList userList = (UserList)event.getData();
mainView.setItems(userList);
}

DataRetrieverImpl 作为一个模块(某种程度上)工作。

private DataRetriever dataRetriever; 
restAdapter = new RestAdapter.Builder().setEndpoint(SERVER_END_POINT).build();
dataRetriever = restAdapter.create(DataRetriever.class);

public void getUserList(final String name) {
Log.i(TAG, "getting user list for: " + name);

Observable<UserList> observable = dataRetriever.getUserList(name);

Log.i(TAG, "subscribe to get userlist");
observable.subscribe(new Action1<UserList>() {
@Override
public void call(UserList userList) {

eventBus.post(new DataRetrieverEvent("UserList", userList));

// save to database
for (User user : userList.getItems()) {
Log.i(TAG, user.getLogin());
try {
dbHelper.create(user);
} catch (SQLException e) {
e.printStackTrace();
}
}

}
}, new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
throwable.printStackTrace();
}
});
}

DataRetriever是改造的接口(interface)。对于命名困惑,我深表歉意。

public interface DataRetriever {

@GET("/search/users")
public Observable<UserList> getUserList(@Query("q") String name);

}

我的任何 Activity

@Override
public void setItems(final UserList userList) {
runOnUiThread(new Runnable() {
@Override
public void run() {
UserAdapter userAdapter = (UserAdapter)recyclerView.getAdapter();
userAdapter.setUserList(userList);
userAdapter.notifyItemRangeInserted(0, userAdapter.getItemCount());
}
});
}

关于android - 如何使用 MVP 和 rxjava 构建我的应用程序并进行改造以从 Observables 中获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29867093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com