2016-11-24 7 views
0

バックグラウンドスレッドで何らかの処理を行い、runOnUiThread()を使用してUIを更新すると、関数内のコードがエラーなく正常に実行されますが、ユーザーが画面に触れる場合にのみレンダリングされます。それ以外の場合は、一貫してレンダリングされます。Android:runOnUiThreadが動作しない、ユーザーが画面に触れると動く

なぜ画面に触れてからレンダリングするのですか?

+0

とデバウンスサンプルコードレンダリング中には、あなたの活動は、onPauseに行くのですか? – Nithinlal

答えて

2

画面が別の画面で重なっている可能性があります。これにより、Activityが一時停止状態(.onPause())メソッドに移動します。あなたは再びそれをタッチすると、それが再び前面になるので、UIの更新イベントを受け取ることができます

1

は、メインスレッド

2

と対話するためにコールバックやandroid.os.Handler.post()を使用してみてくださいそれは操作がブロックしている可能性があり(例えば、あまりにも頻繁にアダプタに通知する)あなたのUIスレッドは、割り込みが発生してブロック解除されます。あなたのシナリオでは、画面に触れることは中断です。

コードを貼り付けると、正確な解決策が見つかる可能性があります。

編集:RxJava

  yourSearchObservable 
      .throttleLast(100, TimeUnit.MILLISECONDS) 
      .debounce(200, TimeUnit.MILLISECONDS) 
      .onBackpressureLatest() 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(
        searchResults -> { 
         // Your success 

        } , 
        () -> { 
         // Error 
        } 
      )); 
+0

私はこれがこのように起こるので、これが理由だと思います。 1.ユーザーが検索入力フィールドに入力します。 2.クエリ文字列は、DBクエリ用のバックグラウンドスレッドに渡されます。 3. DB問合せ後、runOnUiThread()でアダプタのデータを設定します。 私は検索入力をデバウンスしていないので、各文字を押すたびに上記の処理が行われます。 ローカルDBに検索を実装し、リストビューで更新する最適な方法は何ですか? –

+0

ユーザー入力をデバウンスすることができます。例えば、1秒後にあなたのデータベースを照会し、あなたのリストに通知することができます。あなたは私の答えを受け入れることができますか?ありがとう。 – savepopulation

+0

ユーザー入力をデバウンスして検索するコードを投稿できますか?私は有効な作業コードを見つけることができなかったので。 –

関連する問題