使用向spinner中ArrayAdapter绑定数据对象出错报线程错误

本文档描述了在尝试将ArrayAdapter与自定义数据对象绑定到Spinner时遇到的线程错误问题。错误源于非主线程修改UI,解决方案是通过调用`runOnUiThread()`确保在主线程中更新UI。示例代码展示了如何正确地在Android活动中或碎片中应用此修复方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.实现的功能:就是实现一个下拉菜单 的功能,然后通过选中的文本获取对应的id值;

2.操作中遇到的问题:

(1)向spinner中ArrayAdapter绑定数据对象出错,ArrayAdapter<String>没有问题,

例如:

String[] endSiteStr = {"请选择","凯旋","马安砖厂"};
adapterTemp = new ArrayAdapter<SiteModel>( getActivity(), android.R.layout.simple_spinner_item , endSiteStr);
endSiteSpinner.setAdapter(adapterTemp);

(2)如果是放ArrayAdapter<SiteModel>,就会报线程错误

SiteModel的具体内容:

所有的报错信息:

E/AndroidRuntime: FATAL EXCEPTION: OkHttp Dispatcher
    Process: com.zmz.mypro, PID: 28655
    android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
        at android.view.ViewRootImpl.checkThread(ViewRootImpl.java:7021)
        at android.view.ViewRootImpl.focusableViewAvailable(ViewRootImpl.java:3300)
        at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:706)
        at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:706)
        at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:706)
        at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:706)
        at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:706)
        at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:706)
        at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:706)
        at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:706)
        at android.view.ViewGroup.focusableViewAvailable(ViewGroup.java:706)
        at android.view.View.setFlags(View.java:9780)
        at android.view.View.setFocusable(View.java:6799)
        at android.widget.AdapterView.checkFocus(AdapterView.java:728)
        at android.widget.AbsSpinner.setAdapter(AbsSpinner.java:124)
        at android.widget.Spinner.setAdapter(Spinner.java:438)
        at android.support.v7.widget.AppCompatSpinner.setAdapter(AppCompatSpinner.java:393)
        at com.zmz.mypro.fragment.BillInputFragment$1$1.onResponse(BillInputFragment.java:119)
        at okhttp3.RealCall$AsyncCall.execute(RealCall.java:206)
        at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
        at java.lang.Thread.run(Thread.java:818)

解决办法:

我是在碎片中使用onInitData()方法,请求远程数据并初始化数据;顾使用getActivity()来获取活动

                       /*runOnUiThread(() -> {
                            startSiteSpinner.setAdapter(adapterTemp2);
                        });*/
                        getActivity().runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                startSiteSpinner.setAdapter(adapterTemp2);
                            }
                        });

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值