Android单选按钮更新取决于微调器选择线程

时间:2014-03-06 10:25:07

标签: android multithreading radio-button spinner looper

我编写了由主要活动组成的Android应用程序作为操作栏,包含3个片段,每个选项卡有一个片段,用于收集和呈现一些财务数据。其中一个片段包括用于选择货币(美元,欧元等)的微调器。选择特定货币后,我会为其绘制一个图表。此外,我想做一些预测游戏,并要求用户猜测所选货币(UP,DOWN)的第二天表现(费率)。对于预测,我在一个无线电组中使用2个单选按钮(UP,DOWN)。根据每种货币的用户预测,我使用Sqlite为他记住过去的预测,为他建立一些分数。

我的计划如下。为了处理选择的单选按钮,我使用了radio group setOnCheckedChangeListener。根据用户选择,我更新了Sqlite数据库。对于微调器,我使用setOnItemSelectedListener并处理onItemSelected用户选择的货币。 onItemSelected方法启动一个新线程。该线程做两件事:绘制所选货币的图表,并询问Sqlite数据库是否已经对给定货币进行了一些预测。该线程为处理程序(在片段级别注册)构建消息(来自Sqlite记录:UP,DOWN,NO_CHOICE),该处理程序触发(或应该......)handleMessage方法,该方法对于两个单选按钮调用setChecked方法与已获取的消息相关(可能两者都有:如果没有选择给定货币,则为假。)

问题是我的单选按钮只有在我手动点击它时才有效。我无法根据提供的消息自动设置它们。 (该应用程序不会产生任何错误)。我不知道为什么。

下面有一些提炼的代码。

//微调

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> arg0, View arg1,
                    int arg2, long arg3) {
                currency= currencyList[arg2];

                new Thread(new Runnable(){
                    @Override
                    public void run() {
                        // some Sqlite query to get prediction used to build the message
                        Message msg = new Message();
                        msg.obj = prediction;
                        handler.sendMessage(msg);

                        graphView.getHandler().post(new Runnable(){
                        // some processign to build a chart for a given currency
                        }
                // some other stuff
                }).start();

//处理程序

handler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                // TODO Auto-generated method stub
                super.handleMessage(msg);

                if (msg.obj.toString() == "NO_CHOICE") {
                    rb1.setChecked(false);
                    rb2.setChecked(false);
                } else if (/* some other condition*/)
                    // some other code
                }               
            }   
        };

2 个答案:

答案 0 :(得分:0)

使用...new Handler(Looper.getMainLooper()) {...而不是...new Handler() {... - 从不同的线程调用处理程序,只有主线程可以触及任何视图

答案 1 :(得分:0)

Matteo Lovato(在Coursera平台上)指出,handleMessage方法中的if条件不合适,应该是:if (msg.obj.toString().equals("NO_CHOICE"))。它解决了这个问题。