android - 同一 Activity 的多个实例打开

标签 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;
    }
}

点击其中一个对象会打开一个带有参数的新 Activity :

@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;
        }

在新的 Activity 构造函数中看起来像这样:

@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 上,模拟器也是如此),但是当我在手机上加载它时,第二个 Activity 的五个或更多实例同时打开,我必须多次按下后退按钮返回原始屏幕的次数。

我的手机是 Samsung i5700 Spica And 2.3.7 (Cyanogen 7.2 NIGHTLY alpha)

最佳答案

您可能会收到多个 onTouch() 事件。通过调试器验证这一点。在模拟器上,它是相当 bool 值的,但在真实的触摸屏上,在您的手指接触屏幕的几微秒内,您可以接收到多个触摸事件。

如果您可以使用更高级的功能,如 onClick 而不是 onTouch,请执行此操作。如果不能,则需要跟踪触地和触地事件,并且仅在触地尚未触地时才对触地使用react。

一种技巧是将您的 Activity 定义为单个实例,这样您就不会获得多个实例。不过,这几乎肯定不是正确的做法。

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

关于android - 同一 Activity 的多个实例打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9761677/

相关文章:

java - Canvas.rotate 调用导致绘制的项目消失?

android - 在 Android O 中发送本地通知

android - Facebook 登录回调多次触发

java - 如何将命名组件注入(inject) Dagger 2 中的子图中?

android - 如何使用存储在 SDCARD 中的 JPG 将 JPG 文件作为 BITMAP 打开?

java - 如何在异步连接返回时切换 Activity ?

android adb insert contacts 需要点击 "done"才能完成

Android 间Activity生命周期

android - 如何在 Android 上管理 startActivityForResult

java - 如果单击后退按钮,如何登陆或导航到上一个 Activity