注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

悠游自在

似水流年,悠游天地,自在我心

 
 
 

日志

 
 
 
 

mono:等待或进度对话框的实现  

2013-12-17 12:04:41|  分类: IT技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
0 原理,使用ProgressDialog,实现等待或进度对话框
1 自定义一个MyProgressDlg,需要实现IDialogInterfaceOnCancelListener接口,并继承自Java.Lang.Object,如果不继承Java.Lang.Object,编译会报错。MyProgressDlg内部最主要的成员为ProgressDialog progress;
2 MyProgressDlg的构造函数至少需要一个Activity参数,即调用者,没有该参数无法创建ProgressDialog。因此,只能在UI中激活等待或进度对话框,并需要传递有效的Activity参数。
3 对话框支持两种模式,一种是Spinner模式,即等待模式,一种是Horizontal模式,即进度模式。对话框是可以取消的,并显示取消按钮。
构造函数如下
4 设置进度函数是可以在非UI线程里调用的,但不能在非UI线程里直接操作ProgressDialog,否则会异常,因此定义一个消息处理机制,将非UI里设置进度的操作转换为消息,消息总是在UI线程里处理的,在消息处理代码中操作ProgressDialog。
5 辅助函数Show,Dismiss用于显示和关闭对话框。需要注意的时,这两个函数都必须在UI线程里调用。通常Show函数紧跟在构建函数之后,一般都在UI线程,但Dismiss函数可能在处理逻辑中调用,因此调用时通常如下方式:
RunOnUiThread (()=>{
dlg.Dismiss (); 
});
6 完整的MyProgressDlg如下:
    class MyProgressDlg:Java.Lang.Object,IDialogInterfaceOnCancelListener 
    {
        protected ProgressDialog progress;
        protected Activity theParent;
        string theTitle,theMessage;
        public bool IsCancel=true;
        private Handler handle;
        const int MESSAGE_SETPROGRESS=1;
        int theCurPos,theTotal;
        ProgressDialogStyle theStyle;
        public MyProgressDlg(Activity parent):this(parent,ProgressDialogStyle.Spinner,"","")
        {
        }

        public MyProgressDlg(Activity parent,ProgressDialogStyle pstyle, string strTitle,string strMsg)
        {
            theTitle = strTitle;
            theMessage=strMsg;
            theCurPos = 0;
            theTotal = 100;
            theStyle = pstyle;

            progress = new ProgressDialog (parent);
            progress.SetProgressStyle (pstyle);
            progress.SetTitle (strTitle);
            progress.SetMessage (strMsg);
            progress.SetCancelable (true);
            progress.SetOnCancelListener (this);
            //progress.SetButton (-1, "取消", CancelClicked);
            progress.SetButton ("取消",delegate(object sender,DialogClickEventArgs e){
                Dismiss();
            });
            handle = new MyHandler (HandlerHandleMessage);
        }
        class MyHandler : Handler
        {
            public MyHandler (Action<Message> handler)
            {
                this.handle_message = handler;
            }

            Action<Message> handle_message;
            public override void HandleMessage (Message msg)
            {
                handle_message (msg);
                base.HandleMessage (msg);
            }
        }

        protected void HandlerHandleMessage (Message msg) 
        {
            switch (msg.What) {
            case MESSAGE_SETPROGRESS:
                if (theTotal == 0)
                    theTotal = 100;
                if (theStyle == ProgressDialogStyle.Horizontal) 
                    progress.Progress = theCurPos * 100 / theTotal;
                break;
            }
        }

        public void OnCancel (IDialogInterface dialog)
        {
            Dismiss ();
        }
        public void Show()
        {
            if (progress != null) {
                IsCancel = false;
                progress.Show ();
            }
        }
        public void Dismiss()
        {
            IsCancel =true;
            if (progress != null) 
                progress.Dismiss ();
        }
        public void SetProgress(int nCurPos,int nTotal)
        {
            theCurPos = nCurPos;
            theTotal = nTotal;
            handle.SendMessage(new Message(){What = MESSAGE_SETPROGRESS});
        }

    }
7 调用示例
void LengthyJob()
{
var dlg=new MyProgressDlg(this,ProgressDialogStyle.Spinner,"测试等待/进度对话框","等待模式"); 
dlg.Show (); 
 
Thread aThread = new Thread (new ThreadStart (delegate { 
for(int i=0;i<10;i++)
{
if(dlg.IsCancel)
break;
Thread.Sleep (1000);
}
RunOnUiThread (()=>{
dlg.Dismiss ();
});
}));
aThread.Start ();
}
void LengthyJob2()
{
var dlg=new MyProgressDlg(this,ProgressDialogStyle.Horizontal,"测试等待/进度对话框","进度模式");
dlg.Show ();
Thread aThread = new Thread (new ThreadStart (delegate {
for(int i=0;i<10;i++)
{
if(dlg.IsCancel)
break;
dlg.SetProgress (i,10);
Thread.Sleep (1000);
}
RunOnUiThread (()=>{
dlg.Dismiss ();
});
}));
aThread.Start ();
}

  评论这张
 
阅读(96)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018