打开同一活动的多个实例

时间:2012-03-18 19:49:46

标签: android android-activity

我的应用程序有一个在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)

1 个答案:

答案 0 :(得分:1)

您可能会收到多个onTouch()个事件。通过调试器验证这一点。在模拟器上它是非常布尔的,但是在微秒钟的真实触摸屏上,当您的手指与屏幕接触时,您可以接收多个触摸事件。

如果您可以使用更高级别的功能,例如onClick而不是onTouch,请执行此操作。如果你不能,你需要跟踪触地并触摸事件,只有在它没有下降的情况下才会做出反应。

黑客将您的活动定义为单个实例,然后您将无法获得多个实例。这几乎肯定不是正确的做法。

作为旁注,将Thread.sleep()放在代码中几乎总是表示潜伏的错误,并且代码写错了。如果您需要在代码中稍后发生某些事情,请使用Handler.postDelayed()Timer