Как установить задержку в функции «onItemSelected ()» в Android? - PullRequest
0 голосов
/ 24 ноября 2010

Я использую меню в своем приложении так же, как этот пост ... Я использую представление галереи для отображения пунктов моего меню.

Текстовая галерея на Android?

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

Все, что я хочу сделать, - это ввести некоторую задержку в функцию onItemSelected(), так что если между этими задержками пользователь прокручивает следующий элемент, то нет необходимости загружать данные предыдущего, кроме текущего.Время может быть 1 секунда.Если пользователь не перейдет к следующему пункту в течение 1 секунды, эти данные этого элемента должны быть загружены.

Кто-нибудь может помочь?Я думал, чтобы начать поток, но каждый раз для onItemSelected() будет новый поток ...

Я тоже пытался это

public class TimerThreadForCategoriesMenu extends Thread{

int old = -1;
int cur = -1;
CategoriesActivity catAct = null;

public TimerThreadForCategoriesMenu(CategoriesActivity act , int cu) {
    this.cur = cu;
    old = cu;
    this.catAct = act;

}
@Override
public void run() {
    Looper.prepare();

    do{
        old = this.cur;
        for(int i = 0; i<15; i++){
            try{
                Thread.sleep(100);

            }catch (Exception e) {
                e.printStackTrace();
            }
        }

    }while(cur != old);
    catAct.performTask();
    Looper.loop();  
}

public void setCur (int curr){
    this.cur = curr;
}

}

И в OnItemSelected()

      if(timer == null){  

        timer = new TimerThreadForCategoriesMenu(this, arg2);
        timer.start();
    }
    timer.setCur(curInd);

Найдено исключение:

11-24 16: 48: 50.046: ОШИБКА / AndroidRuntime (8049): необработанный обработчик: поток Thread-8 выходит из-за невыполненияисключение
11-24 16: 48: 50.126: ОШИБКА / AndroidRuntime (8049): android.view.ViewRoot $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представления, может касаться его представлений.
11-24 16:48: 50.126: ОШИБКА / AndroidRuntime (8049): на android.view.ViewRoot.checkThread (ViewRoot.java:2683)
11-24 16: 48: 50.126: ОШИБКА / AndroidRuntime (8049): на android.view.ViewRoot.invalidateChild (ViewRoot.java:570)
11-24 16: 48: 50.126: ОШИБКА / AndroidRuntime (8049): в android.view.ViewRoot.invalidateChildInParent (ViewRoot.java:596)
11-2416: 48: 50.126: ОШИБКА / AndroidRuntime (8049): на android.view.ViewGroup.invalidateChild (ViewGroup.java:2396)
11-24 16: 48: 50.126: ОШИБКА / AndroidRuntime (8049): на android.view.View.invalidate (View.java:4945)
11-24 16: 48: 50.126: ОШИБКА / AndroidRuntime (8049): на

Ответы [ 2 ]

1 голос
/ 27 декабря 2012

У меня было точно такое же требование, так как onItemSelected будет вызываться так часто, если пользователь, прокручивая Галерею, хотел избежать этих событий. Я реализовал простой механизм задержки с помощью обработчика следующим образом:

Определите экземпляр обработчика в классе Activity и переопределите handleMessage , который должен иметь логику onItemSelected. Здесь я msg.obj содержит текст выбранного элемента из галереи

Handler handler = new Handler() {
    public void handleMessage(Message msg) {
                    // Add your OnItemSelected code here
        Log.d("Gallery", msg.obj + "");
        Toast.makeText(MainActivity.this, msg.obj + "", Toast.LENGTH_SHORT)
                .show();
    }
};

Это просто произвольная константа для ссылки на сообщение, которое я отправляю с OnItemSelected

public static final int MSG_ITEM_SELECTION = 1;

В onItemSelected я сначала удаляю любое предыдущее сообщение, чтобы избежать запуска события, пока пользователь вращает галерею, а затем добавляю новый объект сообщения с выбранным текстом элемента и публикую его с задержкой 500 мс.

public void onItemSelected(AdapterView<?> adapter, View view,
                int position, long id) {
            handler.removeMessages(MSG_ITEM_SELECTION);
            Message msg = handler.obtainMessage(MSG_ITEM_SELECTION);
            msg.obj = ((TextView) view).getText();
            handler.sendMessageDelayed(msg, 500);
        }

Этот код отлично работает для меня, и я получаю onItemSelected только тогда, когда элемент галереи действительно выбран после остановки вращения.

1 голос
/ 24 ноября 2010

используйте Handler и postDelayed() a Runnable

Редактировать:

Это зависит от того, какую обработку вы хотите выполнить.Взгляните на Looper в ссылке.Пользовательский интерфейс имеет собственный Looper, поэтому вам не нужно его создавать.Просто создайте Handler, однако любые Runnable, опубликованные в обработчике потока пользовательского интерфейса, будут выполняться в потоке пользовательского интерфейса.Если вы делаете что-то, что занимает некоторое время, создайте свой собственный Thread с Handler и отправьте Runnables на это.http://developer.android.com/reference/android/os/Looper.html

Редактировать:

Итак, создайте участников в своей деятельности.

Handler handler;
MyLooper mylooper;

Ваш зацепщик темы.

class MyLooper extends Thread {
  public Handler handler;

  public void run() {
      Looper.prepare();

      handler = new Handler() {
          public void handleMessage(Message msg) {}
      };

      Looper.loop();
  }
}

В вашем Activity.onCreate.

handler = new Handler();
mylooper = new MyLooper();

Теперь создайте Runnable с.

Runnable processinfo = new Runnable() {
    public void run() {
        //  your processing here
    }
}

Runnable updateui = new Runnable() {
    public void run() {
        //  update ui component here
    }
}

Теперь, чтобы получить эти Runnables для выполнения.

mylooper.handler.postDelayed(processinfo, 1000);

handler.post(updateui);

Вам понадобятся некоторыелогика обработки отмены Runnable в зависимости от потребностей вашей задержки.

...