Доступ к области из неверного потока.Доступ к объектам области возможен только в том потоке, в котором они были созданы, при попытке использования внутри spinnerlistener - PullRequest
0 голосов
/ 20 мая 2018

У меня есть фрагмент, где я использую царство, как это

String selectedLang;
Realm realm;
    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.user_profile, container, false);
        ButterKnife.bind(this, rootView);
        realm = Realm.getDefaultInstance();
        loginDatas = realm.where(LoginData.class).findFirst();
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            selectedLang = langList.get(position);
//tried this, still not working, added runOnUiThread and that also didn't work
/*Realm realGuys = Realm.getDefaultInstance();
                realGuys.executeTransactionAsync(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        loginDatas.getUser().setLanguage(selectedLang);
                        realm.insertOrUpdate(loginDatas);
                    }
                }, new Realm.Transaction.OnSuccess() {
                    @Override
                    public void onSuccess() {
                        FragmentTransaction ft = getFragmentManager().beginTransaction();
                        ft.detach(UserFragment.this).attach(UserFragment.this).commit();
                    }
                }, new Realm.Transaction.OnError() {
                    @Override
                    public void onError(Throwable error) {
                        error.printStackTrace();
                    }
                });*/
            realm.executeTransactionAsync(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
//getting the exception below here
                    loginDatas.getUser().setLanguage(selectedLang);
                    realm.insertOrUpdate(loginDatas);
                }
            }, new Realm.Transaction.OnSuccess() {
                @Override
                public void onSuccess() {
                    FragmentTransaction ft = getFragmentManager().beginTransaction();
                    ft.detach(UserFragment.this).attach(UserFragment.this).commit();
                }
            }, new Realm.Transaction.OnError() {
                @Override
                public void onError(Throwable error) {
                    error.printStackTrace();
                }
            });
        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
            selectedLang = langList.get(0);
        }
    });
}

Сначала я беру loginDatas из области, затем у меня есть настройка счетчика и в onItemSelected мне нужно установить значение выбранногоэлемент для loginDatas, а затем установите его в царство.Я настроил свой код таким образом, и я получаю это исключение

7:20.060 9708-9708/com.packagename W/System.err: java.lang.IllegalStateException: Realm access from incorrect thread. Realm objects can only be accessed on the thread they were created.
        at io.realm.BaseRealm.checkIfValid(BaseRealm.java:426)
        at io.realm.LoginDataRealmProxy.realmGet$user(LoginDataRealmProxy.java:99)
        at com.comcast.comcastmobile.entity.LoginData.getUser(LoginData.java:22)
        at com.comcast.comcastmobile.user.UserFragment$2$1.execute(UserFragment.java:189)
        at io.realm.Realm$1.run(Realm.java:1502)
        at io.realm.internal.async.BgPriorityRunnable.run(BgPriorityRunnable.java:34)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:423)
        at java.util.concurrent.FutureTask.run(FutureTask.java:237)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
        at java.lang.Thread.run(Thread.java:818)

1 Ответ

0 голосов
/ 21 мая 2018

Вроде как вы не можете получить доступ к представлениям потока пользовательского интерфейса в фоновом потоке, вы также не можете получить доступ к объектам RealmObject, которые вы получили в другом потоке.

loginDatas было получено из области потока пользовательского интерфейса, поэтому вы не можетеполучить доступ к нему в фоновом потоке, в котором выполняется асинхронная транзакция.Вы должны найти loginDatas из области фонового потока, чтобы изменить его в фоновом потоке.

        realm.executeTransactionAsync(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                LoginData loginDatas = realm.where(LoginData.class).findFirst();
                loginDatas.getUser().setLanguage(selectedLang);
               // realm.insertOrUpdate(loginDatas);
            }
...