Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 来自错误线程的域访问。在尝试使用spinnerlistener内部时,只能在创建的线程上访问领域对象_Android_Realm_Android Spinner - Fatal编程技术网

Android 来自错误线程的域访问。在尝试使用spinnerlistener内部时,只能在创建的线程上访问领域对象

Android 来自错误线程的域访问。在尝试使用spinnerlistener内部时,只能在创建的线程上访问领域对象,android,realm,android-spinner,Android,Realm,Android Spinner,我有一个片段,我正在使用这样的领域 String selectedLang; Realm realm; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.user_p

我有一个片段,我正在使用这样的领域

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

有点像您不能在后台线程上访问UI线程视图,您也不能访问在不同线程上获得的RealmObjects

logindas
是从UI线程领域获得的,因此您无法在执行异步事务的后台线程上访问它。您必须从后台线程域中找到
logindas
,才能在后台线程中修改它

        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);
            }
可能重复的
        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);
            }