我目前正在构建自定义进度,例如公交车的酒吧。 该程序需要显示公交车从一个位置到另一个位置的进度。
当前进度条正在按其时间表运行。 并且代码采用switch语句的形式,但是switch语句变得非常冗长且乏味,因此我仍然需要做很多事情。
是否可以缩短此代码? 可能以循环的形式
Thread t = new Thread(){
@Override
public void run() {
while (!isInterrupted()) {
try {
Thread.sleep(1000);
runOnUiThread(new Runnable() {
@Override
public void run() {
Calendar c = Calendar.getInstance();
mHours = c.get(Calendar.HOUR_OF_DAY);
mMinutes = c.get(Calendar.MINUTE);
mSeconds = c.get(Calendar.SECOND);
String mTimeString = ""+mHours + mMinutes;
ImageView busBar = (ImageView) findViewById(R.id.bus_bar);
int intTimeString = Integer.valueOf(mTimeString);
switch(intTimeString)
{
case 1030:
case 1040:
case 1052:
case 1103:
case 1115:
case 1130:
case 1140:
case 1152:
case 1203:
busBar.setImageResource(R.drawable.bus_bar);
break;
case 1031:
case 1042:
case 1054:
case 1105:
case 1131:
case 1141:
case 1154:
case 1205:
busBar.setImageResource(R.drawable.bus_bar_02);
break;
case 1032:
case 1044:
case 1055:
case 1107:
case 1132:
case 1143:
case 1155:
case 1207:
busBar.setImageResource(R.drawable.bus_bar_03);
break;
case 1033:
case 1046:
case 1057:
case 1109:
case 1133:
case 1145:
case 1157:
case 1209:
busBar.setImageResource(R.drawable.bus_bar_04);
break;
case 1034:
case 1048:
case 1059:
case 1110:
case 1116:
case 1134:
case 1147:
case 1159:
case 1210:
busBar.setImageResource(R.drawable.bus_bar_05);
break;
case 1035:
case 1049:
case 1100:
case 1112:
case 1135:
case 1149:
case 1200:
case 1212:
busBar.setImageResource(R.drawable.bus_bar_06);
break;
case 1036:
case 1050:
case 1101:
case 1113:
case 1136:
case 1150:
case 1201:
case 1213:
busBar.setImageResource(R.drawable.bus_bar_07);
break;
case 1039:
case 1051:
case 1102:
case 1114:
case 1117:
case 1139:
case 1151:
case 1202:
case 1214:
busBar.setImageResource((R.drawable.bus_bar_08));
break;
}
}
});
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
};
t.start();
答案 0 :(得分:1)
有几种方法可以执行此操作: 您可以将图像存储在可迭代的集合中。 尝试使用地图可能会很有趣:
Map<Int, Object> busImageMap = new HashMap<>();
例如。 然后将您的时间int映射到所需的图像:
busImageMap.put(1203, R.drawable.bus_bar);
... etc.
然后检查您的intTimeString是否在地图中:
if (busImageMap.containsKey(intTimeString)){
busBar.setImageResource(busImageMap.get(intTimeString));
}
您仍然需要将时间int映射到所需的图像,但这至少为您提供了一个整洁的迭代器。
答案 1 :(得分:0)
您可以尝试将一个案例的所有时间收集到一个数组或一个列表中,然后使用if / else进行检查。
Java中有一些简单的选项可以使用“包含”(请在此处查看:)
例如:
List<Integer> case1List = Arrays.asList(new Integer[] {1030, 1040, 1052, 1103, 1115, 1130, 1140, 1152, 1203});
List<Integer> case2List ....
....
if (case1List.contains(intTimeString)) {
//do something
}
else if (case2List.contains(intTimeString) {
//do something
}
....