从Android中的另一个线程进行Retrofit和Realm访问

我使用Realm进行数据库服务,使用Retrofit进行服务器服务.
我想从Realm获取数据并将其作为对象传递给Retrofit,但是我收到以下错误

retrofit.RetrofitError: Realm access from incorrect thread. Realm objects can only be accessed on the thread they where created.
05-25 12:58:36.418   W/System.err﹕ at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:400)
05-25 12:58:36.418   W/System.err﹕ at retrofit.RestAdapter$RestHandler.access$100(RestAdapter.java:220)
05-25 12:58:36.418   W/System.err﹕ at retrofit.RestAdapter$RestHandler$2.obtainResponse(RestAdapter.java:278)
05-25 12:58:36.418   W/System.err﹕ at retrofit.CallbackRunnable.run(CallbackRunnable.java:42)
05-25 12:58:36.418   W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080)
05-25 12:58:36.418   W/System.err﹕ at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573)
05-25 12:58:36.423   W/System.err﹕ at retrofit.Platform$Android$2$1.run(Platform.java:142)
05-25 12:58:36.423   W/System.err﹕ at java.lang.Thread.run(Thread.java:856)
05-25 12:58:36.423   W/System.err﹕ Caused by: java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they where created.
05-25 12:58:36.423   W/System.err﹕ at io.realm.Realm.checkIfValid(Realm.java:192)
05-25 12:58:36.423   W/System.err﹕ at io.realm.disabilitiesRealmProxy.isWheelchair(disabilitiesRealmProxy.java:47)
05-25 12:58:36.423   W/System.err﹕ at io.realm.disabilitiesRealmProxy.toString(disabilitiesRealmProxy.java:238)
05-25 12:58:36.423   W/System.err﹕ at retrofit.RequestBuilder.setArguments(RequestBuilder.java:312)
05-25 12:58:36.423   W/System.err﹕ at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:298)
05-25 12:58:36.423   W/System.err﹕ ... 7 more

一切都从这里开始:

if (ConnectionUtils.isConnectionToInternetEnabled(this)) {
        PlaceServerService.getPlaces("London",DatabaseAdapter.getdisabilities(this));
    }

哪个调用方法

public static void getPlaces(String city,disabilities disabilities) {
    PlaceClient client = createService(PlaceClient.class);
    client.getPlaces(city,disabilities,new Callback<PlaceResponse>() {

        @Override
        public void success(PlaceResponse placeResponse,Response response) {
            EventBus.getDefault().post(placeResponse.getPlaces());
        }

        @Override
        public void failure(RetrofitError error) {
            error.printstacktrace();
        }
    });
}

和接口:

@FormUrlEncoded
@POST("/places/city")
void getPlaces(@Field("city") String city,@Field("disabilities") disabilities disabilities,Callback<PlaceResponse> callback);

我没有看到,这里有这个线程问题在哪里?我只是将对象传递给Retrofit方法.也许问题是disabilities对象扩展了RealmObject?

编辑:

但是,这个解决方案有效,为什么?

if (ConnectionUtils.isConnectionToInternetEnabled(this)) {
        disabilities disabilities = DatabaseAdapter.getdisabilities(this);
        disabilities disability = new disabilities(
                disabilities.isWheelchair(),disabilities.isBlind(),disabilities.isDeaf(),disabilities.isOtherMovement());
        PlaceServerService.getPlaces("London",disability);
    }

解决方法

Yeah disabilities扩展了RealmObject并且是Realm的一部分.你可以做的是创建一个新对象:

disabilities disabilities = new disabilities();

然后将disabilities中的内容放入新对象中.这是有效的,因为此对象尚未在Realm中.

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...