数据未存储到领域数据库中

时间:2017-03-22 09:29:01

标签: java android multithreading android-asynctask

  

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

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

“java.lang.IllegalStateException:你的Realm是从一个没有Looper的线程打开的,你提供了一个回调,我们需要一个Handler来调用你的  回调“

在我的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的Model类有这个

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

迫切需要帮助。谢谢提前

2 个答案:

答案 0 :(得分:0)

检查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

答案 1 :(得分:0)

您需要从执行回调中删除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();
    }

我希望这会有所帮助。