2017-08-28 91 views
1

更新查询时出现错误。这是我得到的错误。领域查询不更新android

java.lang.IllegalStateException:从不正确的线程访问域。领域对象只能在创建它们的线程上访问。

这是我正在使用IntentService代码:

public void addPatient(Intent intent){ 
    long patientID = intent.getLongExtra("id",0); 
    Log.v(Constants.TAG, "patientId in datasync " + patientID); 

    Realm real; 
    real = Realm.getDefaultInstance(); 

    if(patientID > 0){ 
     Patient patient = realm.where(Patient.class).equalTo("id",patientID).findFirst(); 
     if(patient != null){ 
      JsonObject patientObject = new JsonObject(); 
      patientObject.add("patient",patient.toJsonObject()); 
      Log.v(Constants.TAG, "patientData " + patient.toJsonObject()); 
      try { 
       // Simulate network access. 
       Log.e(Constants.TAG, "addPatient: appointment ! =null "+patient); 
       mNetworkSubscription = NetworkRequest.performAsyncRequest(api.addPatient(patientObject), (data) -> { 
        // Update UI on main thread 
        try { 
         Log.v(Constants.TAG, "result sdsffgfg" + data.getAsJsonObject().get("result")); 

         if (data.getAsJsonObject().get("error") != null) { 
          publishResults("addPatient", STATUS_ERROR, null); 
         } 

         if (data.getAsJsonObject().get("result") != null) { 
          int serverID = data.get("result").getAsInt(); 
          Log.v(Constants.TAG, "patientServerId " + serverID); 
          realm.executeTransaction(new Realm.Transaction() { 

           @Override 
           public void execute(Realm realm) { 
            patient.setServerID(serverID); 
            realm.copyToRealmOrUpdate(patient); 
            Log.v(Constants.TAG, "fdfdfdg " + patient); 
           } 
          }); 


         } 
        } catch (Exception e) { 
         Log.v(Constants.TAG, "addPatient() exception: " + e.toString()); 
         publishResults("addPatient", STATUS_ERROR, null); 
        } finally { 
         publishResults("addPatient", STATUS_FINISHED, null); 
        } 
       }, (error) -> { 
        // Handle Error 
        Log.e(Constants.TAG, "addPatient Error: " + error.toString()); 
        publishResults("addPatient", STATUS_ERROR, null); 
       }); 

      } catch (Exception e) { 
       Log.e(Constants.TAG, "addPatient() Exception: " + e.toString()); 
       publishResults("addPatient", STATUS_ERROR, null); 
      } 
     } 
    } 
} 

请检查我要去的地方错了。我无法保存查询中的详细信息

+0

您是否缺少'runOnUiThread()'? –

+0

我应该在哪里添加? – winchester100

+0

那么,你的评论说'更新主线程上的UI'。这实际上是在“主线程”上运行吗? Realm似乎并不这么认为 –

回答

2
public void addPatient(final long patientId){ 
    try(Realm realm = Realm.getDefaultInstance()) { 
     if(patientId > 0) { 
      Patient patient = realm.where(Patient.class).equalTo("id", patientId).findFirst(); 
      if(patient != null){ 
       JsonObject patientObject = new JsonObject(); 
       patientObject.add("patient", patient.toJsonObject()); 

       try { 
        // Simulate network access. 
        Log.e(Constants.TAG, "addPatient: appointment ! =null "+patient); 
        mNetworkSubscription = NetworkRequest.performAsyncRequest(api.addPatient(patientObject), (data) -> { 
         // Update UI on main thread 
         try { 
          if (data.getAsJsonObject().get("error") != null) { 
           publishResults("addPatient", STATUS_ERROR, null); 
          } 

          if (data.getAsJsonObject().get("result") != null) { 
           int serverId = data.get("result").getAsInt(); 
           Log.v(Constants.TAG, "patientServerId " + serverId); 
           try(Realm r = Realm.getDefaultInstance()) { 
            r.executeTransaction((_realm) -> { 
             Patient _patient = _realm.where(Patient.class).equalTo("id", patientId).findFirst(); 
             _patient.setServerId(serverId); 
            }); 
           } 
          } 
         } catch (Exception e) { 
          Log.v(Constants.TAG, "addPatient() exception: " + e.toString()); 
          publishResults("addPatient", STATUS_ERROR, null); 
         } finally { 
          publishResults("addPatient", STATUS_FINISHED, null); 
         } 
        }, (error) -> { 
         // Handle Error 
         Log.e(Constants.TAG, "addPatient Error: " + error.toString()); 
         publishResults("addPatient", STATUS_ERROR, null); 
        }); 

       } catch (Exception e) { 
        Log.e(Constants.TAG, "addPatient() Exception: " + e.toString()); 
        publishResults("addPatient", STATUS_ERROR, null); 
       } 
      } 
     } 
    } 
} 
+0

正如我在评论中暗示的那样,需要在'performAsyncRequest'内调用'Realm.getDefaultInstance()',你已经完成 –

+0

是的,但是他还需要在主线程上查询对象:D – EpicPandaForce

+0

@EpicPandaForce :谢谢你的伴侣,你救了我至少2天的工作。我被打了很久 – winchester100