【问题标题】:Data not stored into realm database数据未存储到领域数据库中
【发布时间】:2017-03-22 09:29:00
【问题描述】:

java.lang.IllegalStateException: 你的领域是从一个线程打开的 如果没有 Looper 并且您提供了回调,我们需要一个 Handler 来 调用你的回调

我正在编写一个将在后台执行的代码 - 从文本文件(内部资产)读取,然后将它们放入领域数据库中。但我似乎得到了这个错误

"java.lang.IllegalStateException: 你的领域是从一个没有 Looper 的线程打开的并且你提供了一个回调,我们需要一个处理程序来调用你的 回调"

在我的 onCreate 我有这个

    Realm.init(context);
    realm = Realm.getDefaultInstance();

    ParseInBackground task = new ParseInBackground();
    task.execute();

在 AsyncTask 的后台任务中我得到了这个

try {
            realm = Realm.getDefaultInstance();
            realm.executeTransactionAsync(new Realm.Transaction() {
                                              @Override
                                              public void execute(Realm bgRealm) {

                                                  final ModelClass modelClass = bgRealm.createObject(ModelClass.class);
                                                  try {
                                                      InputStream file = getAssets().open("goodie.txt");
                                                      reader = new BufferedReader(new InputStreamReader(file));
                                                      final String[] line = {reader.readLine()};
                                                      while (line[0] != null) {
                                                          handler.post(new Runnable() {
                                                              @Override
                                                              public void run() {
                                                                  try {
                                                                      line[0] = reader.readLine();
                                                                  } catch (IOException e) {
                                                                      e.printStackTrace();
                                                                  }
                                                                  String[] namelist = line[0].split(":");
                                                                  String iWord = namelist[0];
                                                                  String iDesc = namelist[1];
                                                                  modelClass.setName(iWord);
                                                                  modelClass.setDesc(iDesc);
                                                                  count++;

                                                              }
                                                          });

                                                      }
                                                  } catch (IOException e) {
                                                      e.printStackTrace();
                                                  } finally {
                                                      if (realm != null)
                                                          realm.close();
                                                  }
                                              }

                                          }, new Realm.Transaction.OnSuccess() {
                                              @Override
                                              public void onSuccess() {
                                                  Toast.makeText(MainActivity.this, "Added " + count + "items", Toast.LENGTH_SHORT).show();
                                              }
                                          }, new Realm.Transaction.OnError() {

                                              @Override
                                              public void onError(Throwable error) {


                                              }
                                          }
            );
        } catch (Exception e) {
            e.printStackTrace();
        }

一个名为 ModelClass 的模型类有这个

private String name;
private String desc;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getDesc() {
    return desc;
}

public void setDesc(String desc) {
    this.desc = desc;
}

急需帮助。提前致谢

【问题讨论】:

标签: java android multithreading android-asynctask


【解决方案1】:

检查http://developer.android.com/reference/android/os/Handler.htmlhttp://developer.android.com/reference/android/os/Looper.html

基本上,Realm 在进行 asyc 查询时需要一种与您的线程通信的方式,在 Android 上,自然而然地 Looper 和 Handler 是要走的路。

查看更多示例代码。 https://github.com/realm/realm-java/tree/master/examples/threadExample

【讨论】:

  • 谢谢伙伴..找不到太多使用领域的指南,所以这很有帮助..终于让它工作了
  • 不客气!听起来不错。如果以上答案可以帮助您解决问题,请点赞或标记为答案以帮助其他读者。
  • 由于代表人数少,我的赞成票目前未显示...似乎稍后会显示
【解决方案2】:

您需要从执行回调中删除Handler.post(...)

realm.executeTransactionAsync(new Realm.Transaction() {
                                          @Override
                                          public void execute(Realm bgRealm) {

                                              final ModelClass modelClass = bgRealm.createObject(ModelClass.class);
                                              try {
                                                  InputStream file = getAssets().open("goodie.txt");
                                                  reader = new BufferedReader(new InputStreamReader(file));
                                                  final String[] line = {reader.readLine()};
                                                  while (line[0] != null) {
                                                              try {
                                                                  line[0] = reader.readLine();
                                                              } catch (IOException e) {
                                                                  e.printStackTrace();
                                                              }
                                                              String[] namelist = line[0].split(":");
                                                              String iWord = namelist[0];
                                                              String iDesc = namelist[1];
                                                              modelClass.setName(iWord);
                                                              modelClass.setDesc(iDesc);
                                                              count++;

                                                  }
                                              } catch (IOException e) {
                                                  e.printStackTrace();
                                              } finally {
                                                  if (realm != null)
                                                      realm.close();
                                              }
                                          }

                                      }, new Realm.Transaction.OnSuccess() {
                                          @Override
                                          public void onSuccess() {
                                              Toast.makeText(MainActivity.this, "Added " + count + "items", Toast.LENGTH_SHORT).show();
                                          }
                                      }, new Realm.Transaction.OnError() {

                                          @Override
                                          public void onError(Throwable error) {


                                          }
                                      }
        );
    } catch (Exception e) {
        e.printStackTrace();
    }

我希望这会有所帮助。

【讨论】:

  • 谢谢老兄...做了一点修改,现在可以正常工作了
  • 太好了,很高兴它帮到了你。如果对您有帮助,请接受答案:)
猜你喜欢
  • 1970-01-01
  • 2017-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多