我有一个Android应用程序,在地图中显示路线,我从我自己的网络服务接收数据,如下所示:
“可用”字段指示此路由是否仍处于活动状态(true)或否(false)。我的代码如下:
如果路线处于活动状态,则必须创建或升级(如果存在)
if(json.getBoolean("available") == true)
{
synchronized(realm){
realm.beginTransaction();
Ruta ruta = realm.where(Ruta.class).equalTo("id", json.getLong("id")).findFirst();
//If doesn't exists we create a new route else I clear the coordinates to add news
if(ruta == null){
ruta = realm.createObject(Ruta.class); // Create a new object
}else{
ruta.getCoordenadas().clear();
}
ruta.setNombre(json.getString("name"));
ruta.setType_id(json.getInt("type_id"));
final JSONArray jsonCoordenadas = json.getJSONArray("coordinates");
for(int i = 0; i < jsonCoordenadas.length(); i++){
final JSONObject jsonCoordenada = jsonCoordenadas.getJSONObject(i);
Coordenada coordenadas = realm.createObject(Coordenada.class);
coordenadas.setLat(jsonCoordenada.getDouble("lat"));
coordenadas.setLon(jsonCoordenada.getDouble("lon"));
ruta.getCoordenadas().add(coordenadas);
}
realm.commitTransaction();
}
}
工作完美。
否则“可用”== false,是时候删除了。
else
{
synchronized(realm){
final Ruta ruta = realm.where(Ruta.class)
.equalTo("id", json.getLong("id"))
.findFirst();
if(ruta != null)
{
realm.beginTransaction();
if(ruta.getCoordenadas().size() > 0)
ruta.getCoordenadas().clear();
ruta.removeFromRealm();
realm.commitTransaction();
}
}
}
//If I create, update or delete I Save the last update Date of routes
synchronized(realm){
realm.beginTransaction();
change.setCod(changeBdd);
Log.e("changeBdd",changeBdd);
realm.commitTransaction();
}
这不起作用,如果我第一次这样做,REALM“删除”路线,但如果我在删除后立即第二次收到相同的Json。 REALM再次找到路线,但是当试图破坏粉碎应用程序时。
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Caused by: java.lang.NullPointerException
at com.app.mapApp.ActivityPrincipal$CargaRutas.doInBackground(ActivityPrincipal.java:555)
at com.app.mapApp.ActivityPrincipal$CargaRutas.doInBackground(ActivityPrincipal.java:1)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
... 4 more
另外,所有这些都在AsyncTask中特别是在方法doInBackground
中private class CargaRutas extends AsyncTask<ItemRuta, ItemRuta, Boolean>{
@Override
protected Boolean doInBackground(ItemRuta... items) {
.
.
.
}
}
我不知道我怎么能解决这个问题,任何人都帮助我???我使用REALM 0.76.0
答案 0 :(得分:2)
请参阅Realm文档中的此部分:Using a Realm across Threads
跨线程使用Realm的唯一规则是记住Realm,RealmObject或RealmResults实例不能跨线程传递。当您想要从不同的线程访问相同的数据时,您应该只需获取一个新的Realm实例(即Realm.getInstance(上下文上下文)或其表兄弟)并通过查询获取您的对象。这些对象将映射到磁盘上的相同数据,并且可读和可写任何线程!
Here's an example如何跨多个线程访问Realm数据。
希望这有帮助。