简体   繁体   中英

Data not stored into realm database

java.lang.IllegalStateException: Your Realm is opened from a thread without a Looper and you provided a callback, we need a Handler to invoke your callback

I'm Writing a code that will do in background- read from a text file(inside assets) and then placing them into a realm database.But i seem to get this error

"java.lang.IllegalStateException: Your Realm is opened from a thread without a Looper and you provided a callback, we need a Handler to invoke your callback"

In my onCreate i have this

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

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

and in the do-in-background task of AsyncTask i got this

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

and a Model class called ModelClass has this

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

Desperately in need of help.Thanks in advance

Check http://developer.android.com/reference/android/os/Handler.html and http://developer.android.com/reference/android/os/Looper.html

Basically Realm need a way to communicate with your thread when doing asyc query, on Android, naturally Looper and Handler is the way to go.

Check this for more sample code. https://github.com/realm/realm-java/tree/master/examples/threadExample

You need to remove Handler.post(...) from within the execute callback.

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

I hope this helps.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM