monodroid开发之--call Hanlder
monodroid和java在开发android应用程序的差不多。贴点代码希望有对研究monodroid的兄弟帮助。
(应用http://www.cnblogs.com/TerryBlog/archive/2010/08/25/1808445.html)android 有一种叫消息队列的说法,这里我们可以这样理解:假如一个隧道就是一个消息队列,那么里面的每一部汽车就是一个一个消息,这里我们先忽略掉超车等种种因素,只那么先进隧道的车将会先出,这个机制跟我们android 的消息机制是一样的。
Android 的线程消息机制
android 在设计的时候引入了 wince 的消息机制,即将每一个消息发送到队列里面,遵循先进先出原则。发送消息并不会阻塞线程,而接收线程会阻塞线程,这是因为 Android 的Handler 机制,当Handler 处理完一个 Message 对象才会接着去取下面一个消息进行处理。
test_Handler.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Util;
namespace Demo
{
[Activity(Label = "test_Handler")]
public class test_Handler : Activity
{
public const int CALL_FROM_WEB_COMPLETE = 0x001002;
public const int CALL_FROM_WEB_SUCCESSFUL = 0x001003;
protected Handler handler = null;
private Handler_CallBack handler_CallBack = null;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
handler_CallBack = new Handler_CallBack();
handler_CallBack.Completed += (o, e) =>
{
//..call function
};
handler = new Handler(handler_CallBack);
System.Threading.ThreadPool.QueueUserWorkItem((objs) =>
//..or handler.Post(() =>
{
try
{
//..execute function
}
catch (Exception ex)
{
Log.I("Error", ex.ToString());
}
finally
{
handler.SendMessage(new Message() { What = CALL_FROM_WEB_COMPLETE, Arg1 = CALL_FROM_WEB_COMPLETE });
}
});
}
internal class Handler_CallBack : Handler.ICallback
{
public event EventHandler Completed;
public bool HandleMessage(Message msg)
{
if (msg.What == CALL_FROM_WEB_COMPLETE)
{
if (Completed != null)
{
Completed(CALL_FROM_WEB_SUCCESSFUL, new EventArgs());
}
return true;
}
return false;
}
public IntPtr Handle
{
get { return this.Handle; }
}
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.Util;
namespace Demo
{
[Activity(Label = "test_Handler")]
public class test_Handler : Activity
{
public const int CALL_FROM_WEB_COMPLETE = 0x001002;
public const int CALL_FROM_WEB_SUCCESSFUL = 0x001003;
protected Handler handler = null;
private Handler_CallBack handler_CallBack = null;
protected override void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
handler_CallBack = new Handler_CallBack();
handler_CallBack.Completed += (o, e) =>
{
//..call function
};
handler = new Handler(handler_CallBack);
System.Threading.ThreadPool.QueueUserWorkItem((objs) =>
//..or handler.Post(() =>
{
try
{
//..execute function
}
catch (Exception ex)
{
Log.I("Error", ex.ToString());
}
finally
{
handler.SendMessage(new Message() { What = CALL_FROM_WEB_COMPLETE, Arg1 = CALL_FROM_WEB_COMPLETE });
}
});
}
internal class Handler_CallBack : Handler.ICallback
{
public event EventHandler Completed;
public bool HandleMessage(Message msg)
{
if (msg.What == CALL_FROM_WEB_COMPLETE)
{
if (Completed != null)
{
Completed(CALL_FROM_WEB_SUCCESSFUL, new EventArgs());
}
return true;
}
return false;
}
public IntPtr Handle
{
get { return this.Handle; }
}
}
}
}