0

カスタムダイアログがあり、以下のコードで作成されています。

public DialogFragment CreateNewPostedMessageDialog(CardSwipeData data, 
    List<MessagesMap> messagesMap, 
    string fbProfileimageAsByteString, 
    Context context) {
            DialogFragment newFragment = 
                new NewPostedMessageDialogFragment(data, messagesMap,
                                                   fbProfileimageAsByteString, 
                                                   context);
            return newFragment;
        }

これは、私のアクティビティのOnResumeRunOnUiThreadから呼び出されます。

ThreadPool.QueueUserWorkItem(state => {
    // Processing stuff here               

    RunOnUiThread(() => {
        DialogFragment dialog = CreateNewPostedMessageDialog(cardSwipeData,
           messagesMap, bitmapByteString, this);

        dialog.Show(FragmentManager, "PostedMessage");

        // ListAdapter gets updated here

        Thread.Sleep(3000);

        dialog.Dismiss();
    });
});

3秒後にダイアログを閉じたいのですが、ダイアログが表示されないのに3秒後にリストが更新されます。私が睡眠で間違っていることはありますか?

4

2 に答える 2

2

Since runOnUiThread runs on the UI thread

Thread.Sleep(3000);

blocks the UI thread for three seconds, making the UI unresponsive . If you want to dismiss the Dialog after three seconds you can use the postDelayed() from the Handler class:

Declare an Handler handler = new Handler();

then, inside the runOnUiThread change the code you post with:

   {

      final DialogFragment dialog = CreateNewPostedMessageDialog(cardSwipeData,
       messagesMap, bitmapByteString, this);

     dialog.Show(FragmentManager, "PostedMessage");

    // ListAdapter gets updated here

     handler.postDelayed( new Runnable() {

          @Override
          public void run() {
             dialog.Dismiss();
          }
     }, 3000) ;

});

check for typo

于 2013-01-16T15:32:39.370 に答える
1

間違っているのは、で生成したバックグラウンドスレッドではなく、UIスレッドをスリープしていることですTreadPool。代わりにこれを試してください:

ThreadPool.QueueUserWorkItem(state => {
    // Processing stuff here               

    DialogFragment dialog;

    RunOnUiThread(() => {
        dialog = CreateNewPostedMessageDialog(cardSwipeData,
           messagesMap, bitmapByteString, this);

        dialog.Show(FragmentManager, "PostedMessage");
    });

    // ListAdapter gets updated here
    Thread.Sleep(3000);

    RunOnUiThread(() => dialog.Dismiss()); 
});
于 2013-01-16T15:35:14.433 に答える