Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用RxJAVA和DAO更新数据库插入的UI_Java_Android_Rx Java - Fatal编程技术网

使用RxJAVA和DAO更新数据库插入的UI

使用RxJAVA和DAO更新数据库插入的UI,java,android,rx-java,Java,Android,Rx Java,我有一个ChatThreadsActivity(),它显示两个人之间的消息 每当用户打开活动时,我都会制作一个API来获取最近的100条消息。因此,在onCreate()方法中,我调用makeApiRequestToGetChatThread() 我知道我在这里做了很多错事 在onNext()内部,我向chatThreadAdapter添加行。我知道这是错误的,因为我在插入后更新了适配器 chatDaoObject.querychatsthreadsfromdb(someId).observeO

我有一个
ChatThreadsActivity()
,它显示两个人之间的消息

每当用户打开活动时,我都会制作一个API来获取最近的100条消息。因此,在
onCreate()
方法中,我调用
makeApiRequestToGetChatThread()

我知道我在这里做了很多错事

  • onNext()
    内部,我向
    chatThreadAdapter
    添加行。我知道这是错误的,因为我在插入后更新了适配器

  • chatDaoObject.querychatsthreadsfromdb(someId).observeOn(AndroidSchedulers.mainThread()).subscribe()

    这应该匿名吗?什么时候会取消订阅

  • 如何取消订阅

  • 我读过关于背压的书,意识到这就是它,我在安卓显示器上运行过它,下面是我如何识别它的。我这样做对吗


  • private void MakeApiRequestToGetAtthreads(){
    公共void onResponse(呼叫、最终响应){
    final String responseString=response.body().String();
    runOnUiThread(()->{
    最终JSONArray数组=新JSONArray(responseString);
    JSONObject对象;
    for(int i=0;i
    我使用RxJAVA和SQLBrite Dao,下面是查询的样子:

    //In `ChatDao` class
    ChatDataDao extends Dao {
      ...
      ...
      public Observable<long> insertAChatInDB(JSONObject o) {
        ChatThreadsTable.ContentValuesBuilder valuesBuilder = ChatThreadsTable.contentValues();
        ...
        //populating columns values
        ...
        return insert(ChatThreadsTable.TABLE_NAME, valuesBuilder.build(), SQLiteDatabase.CONFLICT_IGNORE);
      }
      public Observable<List> queryChatThreadsFromDB () {
        return rawQuery("SELECT * FROM " + ChatThreadsTable.TABLE_NAME).run().mapToList(ChatObjectMapper.MAPPER);
      }
      ...
      ...
    }
    
    //在'ChatDao'类中
    ChatDataDao扩展了Dao{
    ...
    ...
    公众可观察的insertAChatInDB(JSONObject o){
    ChatThreadsTable.ContentValuesBuilder valuesBuilder=ChatThreadsTable.contentValues();
    ...
    //填充列值
    ...
    返回insert(ChatThreadsTable.TABLE\u NAME,valuesBuilder.build(),SQLiteDatabase.CONFLICT\u IGNORE);
    }
    公共可观察queryChatThreadsFromDB(){
    返回rawQuery(“选择*自”+ChatThreadsTable.TABLE_NAME).run().mapToList(ChatObjectMapper.MAPPER);
    }
    ...
    ...
    }
    
    编辑:

    这是查询数据库而不必担心订阅/取消订阅的正确方法吗

    rawQuery("SELECT * FROM " + SomeObject.TABLE_NAME + " ORDER BY " + SomeObject.COL1 + " , " +SomeObject.COL2 + " DESC").run().mapToList(SomeObjectMapper.MAPPER)
      .flatMap(new Func1<List<SomeObject>, Observable<SomeObject>>() {
          @Override
          public Observable<SomeObject> call(List<SomeObject> SomeObjects) {
    
              return Observable.from(SomeObjects);
          }
      }).doOnNext(new Action1<SomeObject>() {
          @Override
          public void call(SomeObject chatThreadObject) {
          }
      }).subscribe();
    
    rawQuery(“从”+SomeObject.TABLE_NAME+”中选择*按“+SomeObject.COL1+”、“+SomeObject.COL2+”DESC”排序”).run().mapToList(SomeObjectMapper.MAPPER)
    .flatMap(新函数1(){
    @凌驾
    公共可观察调用(列出一些对象){
    从(某些对象)可观察到的返回;
    }
    }).doOnNext(新行动1){
    @凌驾
    公共void调用(SomeObject chatThreadObject){
    }
    }).subscribe();
    
    这些教程告诉人们创建自己的
    订阅者是怎么回事?这是一个经过清理的版本:

    private void makeApiRequestToGetChatThreads() {
      // ... some call that calls back onResponse
    }
    public void onResponse(Call call, final Response response) {
      // are you sure this is how you parse a JSON String?
      Observable
        .from(response.body().string())
        .observeOn(Schedulers.computation())
        .flatMapIterable(JsonArray::new)
        .map(JSONObject::new)
        .flatMap(chatDaoObject::insertAChatInDB)
        .flatMap(chatDaoObject::queryChatThreadsFromDB)
        .observeOn(AndroidSchedulers.mainThread())
        .doOnNext(chatThreadAdapter::addAllChatThreadsIntoList)
        .subscribe(dummy -> {}, throwable -> {
            e.printStackTrace();
            Crashlytics.logException(e);
        });
    }
    
    • 很可能有更好的方法可以直接让网络调用返回一个可观察的结果。检查您的文档/同行
    • 当Observable完成所有处理和UI更新时,它将自行取消订阅。但是,如果网络呼叫需要一段时间才能完成,则用户可能已经切换了屏幕/应用程序,UI操作将中断您的应用程序。考虑在视图中保存订阅并取消订阅。提示:在
      onResponse
      中创建订阅是。。。不是最优的
    • 您将获得100个线程,并为每个线程更新UI。你确定你想要吗
    • 我不认为你需要关心背压

    我们使用SQLBrite Dao,它将查询结果映射到一个对象,并返回
    Observable
    。因为他们正在使用
    Observable.defer()
    [定义:在观察者订阅之前,不要创建
    Observable
    ,并为每个观察者创建一个新的观察对象]。因此,为了实现这一点,我们必须在我们的活动中创建一个匿名订阅。取消订阅的最佳方式是什么?你没有。请参阅上面的代码片段。Dao给您一个发出单个项的可观察对象,然后它调用
    onComplete
    。如果您使用
    flatMap
    ,它将负责订阅/项目生产/完成生命周期。我不明白
    订阅
    在这里做什么。假人是做什么用的?第二个参数是错误处理程序,但什么是
    dummy
    ?一个伪参数-您不需要对项目执行任何操作,所有处理都已在上面的可观察链中完成,但为了方便访问错误处理程序,您需要提供一个值,因此我们提供一个不可操作的参数。请检查编辑。这是查询数据库的正确方法吗?
    private void makeApiRequestToGetChatThreads() {
      // ... some call that calls back onResponse
    }
    public void onResponse(Call call, final Response response) {
      // are you sure this is how you parse a JSON String?
      Observable
        .from(response.body().string())
        .observeOn(Schedulers.computation())
        .flatMapIterable(JsonArray::new)
        .map(JSONObject::new)
        .flatMap(chatDaoObject::insertAChatInDB)
        .flatMap(chatDaoObject::queryChatThreadsFromDB)
        .observeOn(AndroidSchedulers.mainThread())
        .doOnNext(chatThreadAdapter::addAllChatThreadsIntoList)
        .subscribe(dummy -> {}, throwable -> {
            e.printStackTrace();
            Crashlytics.logException(e);
        });
    }