Открыто несколько экземпляров одного и того же действия - PullRequest
1 голос
/ 18 марта 2012

У моего приложения есть экран, который обновляется каждую секунду в 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, как и на эмуляторе), но когда я загружаю его на свой телефон, одновременно открывается пять или более экземпляров второго действия, и мне приходится нажимать несколько раз кнопку возвратараз, чтобы вернуться к исходному экрану.

Мой телефон - Samsung i5700 Spica с А 2.3.7 (Cyanogen 7.2 NIGHTLY alpha)

1 Ответ

1 голос
/ 19 марта 2012

Вы, вероятно, получаете несколько onTouch() событий.Проверьте это через отладчик.в эмуляторе это довольно логично, но на реальном сенсорном экране в микросекундах, когда ваш палец соприкасается с экраном, вы можете получить несколько событий касания.

Если вы можете использовать функцию более высокого уровня, такую ​​какonClick вместо onTouch, сделайте это.Если вы не можете отслеживать события касания и касания и реагировать на них, только если они еще не выключены.

Хаком было бы определить вашу деятельность как отдельный экземпляр, а затемвы не получите несколько экземпляров.Это почти наверняка не то, что нужно делать.

В качестве примечания, добавление Thread.sleep() в ваш код почти всегда указывает на скрытую ошибку и то, что код написан неправильно.Если вам нужно, чтобы что-то произошло на более позднем этапе кода, используйте Handler.postDelayed() или Timer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...