我编写了由主要活动组成的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
}
}
};
答案 0 :(得分:0)
使用...new Handler(Looper.getMainLooper()) {...
而不是...new Handler() {...
- 从不同的线程调用处理程序,只有主线程可以触及任何视图
答案 1 :(得分:0)
Matteo Lovato(在Coursera平台上)指出,handleMessage方法中的if条件不合适,应该是:if (msg.obj.toString().equals("NO_CHOICE"))
。它解决了这个问题。