gpt4 book ai didi

mvvm - 为什么在观察LiveData时未调用onChanged()

转载 作者:行者123 更新时间:2023-12-03 10:19:07 24 4
gpt4 key购买 nike

此问题是此问题的后续处理:How to make retrofit API call using ViewModel and LiveData

该帖子的回复中突出显示的错误1和2已得到修复。对于错误3,我尚未将API调用移到存储库中,但是一旦代码开始正常运行,我就将其移到存储库中。

因此,我尝试使用带有LiveData和ViewModel的MVVM使用Retrofit进行API调用。 API调用(当前在ViewModel中)可以正常工作,但 Activity 中的Observer不会接受更改。

我将ViewModel观察器设置如下:

public class PopularGamesActivity extends AppCompatActivity {


private static final String igdbBaseUrl = "https://api-endpoint.igdb.com/";
private static final String FIELDS = "id,name,genres,cover,popularity";
private static final String ORDER = "popularity:desc";
private static final int LIMIT = 30;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_popular_games);

PopularGamesViewModel popViewModel = ViewModelProviders.of(this).get(PopularGamesViewModel.class);
popViewModel.getGameList().observe(this, new Observer<List<Game>>() {
@Override
public void onChanged(@Nullable List<Game> gameList) {
String firstName = gameList.get(0).getName();
Timber.d(firstName);
}

我的ViewModel代码如下:
public class PopularGamesViewModel extends AndroidViewModel {

private static final String igdbBaseUrl = "https://api-endpoint.igdb.com/";
private static final String FIELDS = "id,name,genres,cover,popularity";
private static final String ORDER = "popularity:desc";
private static final int LIMIT = 30;


public PopularGamesViewModel(@NonNull Application application) {
super(application);

}

public LiveData<List<Game>> getGameList() {
final MutableLiveData<List<Game>> gameList = new MutableLiveData<>();

// Create the retrofit builder
Retrofit.Builder builder = new Retrofit.Builder()
.baseUrl(igdbBaseUrl)
.addConverterFactory(GsonConverterFactory.create());

// Build retrofit
Retrofit retrofit = builder.build();

// Create the retrofit client
RetrofitClient client = retrofit.create(RetrofitClient.class);
Call<List<Game>> call = client.getGame(FIELDS,
ORDER,
LIMIT);

call.enqueue(new Callback<List<Game>>() {
@Override
public void onResponse(Call<List<Game>> call, Response<List<Game>> response) {
Timber.d("api call sucesss");
if (response.body() != null) {
Timber.d("First game: " + response.body().get(0).getName());

gameList.setValue(response.body());
}
}

@Override
public void onFailure(Call<List<Game>> call, Throwable t) {
Timber.d("api call failed");
}
});

return gameList;
}

}

当我运行代码时,ViewModel类中的onResponse将从API调用中输出正确的响应,因此该调用正常工作。但是PopularGamesActivity类中的onChanged()永远不会被调用。有人可以告诉我我在做什么错吗?谢谢!

最佳答案

好的,这原来是一个奇怪的android studio错误。我最初是在真正的nexus 4设备上运行代码的,而onChange从未被调用。但是,在模拟设备上运行它之后,它立即开始工作。现在,它也可以在我的真实设备上运行。

我不知道其背后的实际原因,但是如果将来有人遇到无法调用onChange的问题,请尝试切换设备/仿真器。

干杯。

关于mvvm - 为什么在观察LiveData时未调用onChanged(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51793456/

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