java - Livedata 观察未运行
问题描述
我尝试使用这个实现 ViewModel 。但是从不调用观察。
基本上,这个应用程序在 SAMPLE_URL 上发出网络请求,将 JSON 转换为 List 并通过 bookView 显示列表。该应用程序在没有 ViewModel 的情况下运行良好。使用 ViewModel 时,应用程序会运行,但不会调用观察,也不会显示任何数据。
我在这里做错了什么?
BookActivity 类:
public BookAdapter bookAdapter;
ListView bookView;
public final static String SAMPLE_URL = "https://www.googleapis.com/books/v1/volumes?q=search+terms";
public ArrayList<Book> books = new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activitymain);
bookView = findViewById(R.id.list);
bookAdapter = new BookAdapter(BookActivity.this,books);
BookViewModel bookViewModel = new ViewModelProvider(this).get(BookViewModel.class);
bookViewModel.getBooks().observe(this, books -> {
Log.d("INSIDE", "observe");
bookAdapter = new BookAdapter(this,books);
bookView.setAdapter(bookAdapter);
bookAdapter.notifyDataSetChanged();
});
}
BookViewModel 类:
public class BookViewModel extends ViewModel {
public MutableLiveData<List<Book>> books;
public LiveData<List<Book>> getBooks(){
if (books == null) {
books = new MutableLiveData<>();
loadBooks();
}
return books;
}
private void loadBooks() {
thread.start();
}
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
URL url = QueryUtility.createURL(BookActivity.SAMPLE_URL);
try{
assert url != null;
String JSONResponse = QueryUtility.ReadFromStream(QueryUtility.MakeHTTPRequest(url));
books = new MutableLiveData<>(QueryUtility.extractBooksFromJSON(JSONResponse));
}
catch (IOException | JSONException ioException){
ioException.printStackTrace();
}
}
});
}
解决方案
您的线程为books
. 您可能观察到的原始延迟加载实例永远不会更新。您应该更新现有实例的值。
books.postValue(QueryUtility.extractBooksFromJSON(JSONResponse));
推荐阅读
- php - Laravel 5.6 - 如何获取房间交易的最后 X 位客人姓名?
- java - Runtime.getRuntime().exec("some.exe") 静默
- docker - 无法将蜜蜂队列连接到 docker 容器
- c# - 在 Xamarin 中动态创建按钮
- python - 使用 QProcess 在虚拟环境中启动和停止 python 脚本
- laravel - 雄辩:如何获得一个模型,其相关模型的计数与条件正好为 n?
- javascript - 移动到顶部的垂直导航栏
- angular - 通过按钮增加和减少 Angular Material 滑块
- linux - 使用 ffmpeg 将实时视频从树莓派流式传输到 Web 服务器以进行分发
- ruby - 数组中的整数要么完全奇数,要么完全偶数,除了一个整数