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