【问题标题】:Dismissing a custom dialog from RunOnUiThread after N secondsN 秒后从 RunOnUiThread 关闭自定义对话框
【发布时间】:2013-01-16 15:30:41
【问题描述】:

我有一个自定义对话框,它是由下面的代码创建的:

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

它是从我的 Activity 的 OnResume RunOnUiThread 调用的:

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 秒后仍会更新。我的睡眠有什么问题吗?

【问题讨论】:

  • 为此使用Handler postDelayed 方法。

标签: android multithreading dialog xamarin.android android-alertdialog


【解决方案1】:

由于runOnUiThread 在 UI 线程上运行

Thread.Sleep(3000);

阻塞 UI 线程三秒钟,使 UI 无响应。如果您想在三秒钟后关闭对话框,您可以使用 Handler 类中的 postDelayed()

Declare an Handler handler = new Handler();

然后,在runOnUiThread 中更改您发布的代码:

   {

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

});

检查错别字

【讨论】:

    【解决方案2】:

    您做错了什么是您正在休眠 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()); 
    });
    

    【讨论】:

    • 谢谢!我不知道可以使用多个 UI 线程。
    猜你喜欢
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    相关资源
    最近更新 更多