我的应用程序有一个在AsyncTask中每秒刷新一次的屏幕:
class BarRefresh extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
// doSomething();
while(redraw){
for(int i = 0; i < c.sets.size(); i++)
{
vals[i] = c.sets.get(i).getLast();
}
graph.updateVals(vals);
graph.postInvalidate();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if(isCancelled()){
break;
}
}
return null;
}
}
单击其中一个对象将打开一个带有参数的新活动:
@Override
public boolean onTouch(View v, MotionEvent ev) {
// TODO Auto-generated method stub
float[] coords = new float[2];
coords[0] = ev.getX();
coords[1] = ev.getY();
int set = 0;
for(int i = 0; i < graph.values.length; i++){
if(graph.rects[i].contains(coords[0], coords[1]))
{
redraw = false;
Bundle chosen = new Bundle();
chosen.putInt("set", i);
Intent bb = new Intent(GraphTestActivity.this, LineGraphActivity.class);
bb.putExtras(chosen);
startActivity(bb);
// set = i;
}
}
//Toast t = Toast.makeText(GraphTestActivity.this, "KLIKNIETO " + set, Toast.LENGTH_SHORT);
//t.show();
return false;
}
在新的活动构造函数中看起来像这样:
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Bundle pick = getIntent().getExtras();
setNr = pick.getInt("set");
c = Common.getInstance();
set = c.sets.get(setNr);
graph = new LineGraph(LineGraphActivity.this, set);
setContentView(graph);
}
这是事情变得奇怪的地方。在模拟器上一切正常(应用程序在2.1 API上,模拟器也是如此),但是当我在手机上加载时,第二个活动的五个或更多实例同时打开,我必须按下后退多个按钮时间回到原来的屏幕。
我的手机是三星i5700 Spica和2.3.7(Cyanogen 7.2 NIGHTLY alpha)
答案 0 :(得分:1)
您可能会收到多个onTouch()
个事件。通过调试器验证这一点。在模拟器上它是非常布尔的,但是在微秒钟的真实触摸屏上,当您的手指与屏幕接触时,您可以接收多个触摸事件。
如果您可以使用更高级别的功能,例如onClick
而不是onTouch
,请执行此操作。如果你不能,你需要跟踪触地并触摸事件,只有在它没有下降的情况下才会做出反应。
黑客将您的活动定义为单个实例,然后您将无法获得多个实例。这几乎肯定不是正确的做法。
作为旁注,将Thread.sleep()
放在代码中几乎总是表示潜伏的错误,并且代码写错了。如果您需要在代码中稍后发生某些事情,请使用Handler.postDelayed()
或Timer
。