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

Livedata观察到未运行

东方吕恭
2023-03-14

我尝试使用这个实现ViewModel。但观察者从未被调用。

基本上,这个应用程序在SAMPLE_URL上发出网络请求,将JSON转换为列表,并通过BookView显示列表。这个应用程序在没有ViewModel的情况下工作得很好。使用ViewModel,应用程序会运行,但Observer从未被调用,也没有显示任何数据。

我在这里做错了什么?

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();
            }
        }
    });
}

共有1个答案

长孙诚
2023-03-14

线程为books创建了一个新的MutableLiveData实例。您可能观察到的原始懒散加载实例从未更新。您应该更新现有实例的值。

books.postValue(QueryUtility.extractBooksFromJSON(JSONResponse));
 类似资料:
  • 我有一个片段和一个相应的viewmodel类。我在Fragment方法上从DB获取包装为LiveData的联系人列表。它工作得很好,我使用PagedListAdapter显示联系人列表,如下所示: 我在我的片段中添加了一个观察者,如下所示: 有一个按钮在我的片段,它把我带到另一个屏幕,在那个屏幕上我添加更多的联系人到表。但当我从那个屏幕回到我的片段时,观察者并没有被调用。这意味着返回时不会调用方法

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?

  • 我有一个单独的类来处理数据提取(特别是Firebase),我通常从它返回LiveData对象并异步更新它们。现在我希望将返回的数据存储在ViewModel中,但问题是为了获得所述值,我需要观察从数据提取类返回的LiveData对象。observe方法需要一个LifecycleOwner对象作为第一个参数,但我的ViewModel中显然没有这个对象,而且我知道我不应该在ViewModel中保留对ac

  • 我正在从ViewModel中的Dialog片段更新LiveData值,但无法获取片段中的值。 视图模型: BaseViewModel: 对话框片段: 我从DialogFragment的xml文件中调用viewmodel的resendOTP(contactId:String)方法: 现在,每当我尝试从片段中调用resendOTP响应LiveData时,它都不会被调用: 所以我在这里做错了什么。 编辑

  • 试图让LiveData与Room一起工作: 因为我观察到tdao.getall(),所以我希望在我的活动中,当同步完成时,它会刷新日历。现在,您必须重新加载该活动,以获取在执行同步后放入数据库的数据。我对Room和LiveData很陌生。有什么想法吗?希望我没有拿出太多的代码,这是从一个相当大的应用程序到目前为止。