2010-11-24 19 views
0

私のアプリケーションでこのポストと同じメニューを使用しています...私はメニュー項目を表示するためにギャラリービューを使用しています。アンドロイドの "onItemSelected()"機能で遅延を設定する方法は?

Text Gallery on Android?

問題は、新しいアイテムがロードされ、そのトピックに関連するデータを選択されたときに私は、ギャラリーのためonItemSelectedリスナーを実装する、ということです。 しかし、私はまた、ユーザーがギャラリーを完全にスクロールできるようにしたいと思っています。しかし、次の項目に移動するたびにonItemSelected()関数が呼び出され、データのロードが開始されます。

私がしたいのは、onItemSelected()の機能に遅延を入れることです。その遅延の間に次の項目をスクロールすると、前回のデータを読み込む必要はありませんが、現在のデータが読み込まれます。時間は1秒です。ユーザーが1秒で次のアイテムに行くことができない場合は、そのアイテムのデータをロードする必要があります。

誰でも手助けできますか?私は

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); 

見つかり例外ではあまりにもこれを試してみました

...私はスレッドを開始すると思ったが、onItemSelected()のためのたびに新しいスレッドがあるでしょう。

11-24 16:48:50.046:ERROR/AndroidRunti (8049):Uncaughtハンドラ:スレッドキャッチされていない例外のためスレッド8が終了する
11-24 16:48:50.126:ERROR/AndroidRuntime(8049):android.view.ViewRoot $ CalledFromWrongThreadException:ビュー階層はそのビューに触れることができます。
11-24 16:48:50.126:ERROR/AndroidRuntime(8049):android.view.ViewRoot.checkThread(ViewRoot.java:2683)
11-24 16:48:50.126:ERROR/AndroidRuntime(8049) :android.view.ViewRoot.invalidateChild(ViewRoot.java:570)
11-24 16:48:50.126:ERROR/AndroidRuntime(8049):android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:596)
11-24 16:48:50.126:ERROR/AndroidRuntime(8049):android.view.ViewGroup.invalidateChild(ViewGroup.java:2396)で
11-24 16:48:50.126:ERROR/AndroidRuntime(8049): android.view.View.invalidate(View.java:4945)
11-24 16:48:50.126:ERROR/AndroidRuntime(8049):

+0

大丈夫です。あなたがする必要があるのは、UIコンポーネントにUIコンポーネントを更新するためにRunnableをUIスレッドに投稿できるように、アクティビティでHandlerを作成することです。 – techiServices

+0

また、スレッドループをdo..while(これはlooper.prepareの処理がしているものです)と一緒にしない方が良いでしょう。スレッドに別のハンドラを作成し、そのスレッドにRunnableをポストします。 – techiServices

+0

私は理解できません。いくつかのコードを記述できますか? – Arslan

答えて

1

使用HandlerpostDelayed()Runnable

編集:

それはあなたが何をしたいどのような処理に依存

Looperを参照してください。 UIには独自のLooperがありますので、作成する必要はありません。 Handlerを作成するだけですが、UIハンドラに投稿されたRunnableはUIスレッド上で実行されます。完了までに時間がかかるものは、HandlerThreadとそれ以降は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キャンセル処理するためにいくつかのロジックが必要になります。

+0

あなたは説明できますか? – Arslan

+0

@Arsian:助けてくれることを願っています。私に知らせないならば。 – techiServices

+0

それは動作していません...例外を与える! Plzヘルプ。 – Arslan

1

私がまったく同じ要件を満たしていたのは、ユーザーがギャラリーを回ってこれらのイベントを回避したい場合、onItemSelectedが頻繁に呼び出されるからです。

アクティビティクラスにハンドラインスタンスを定義し、handleMessageをオーバーライドします。これにはonItemSelectedロジックが必要です。ここで、私はmsg.objはギャラリーからのSelectedItemのテキスト

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

onItemSelectedで
public static final int MSG_ITEM_SELECTION = 1; 

から送信するメッセージを参照するだけで任意の定数であります私はまず、以前のメッセージを削除して、ユーザーがギャラリーを回している間にイベントを発生させないようにしてから、選択したアイテムのテキストを含む新しいメッセージオブジェクトを追加し、500msの遅延で通知します。

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を受けます。

関連する問題