问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

mono开发安卓的人多吗

发布网友 发布时间:2022-04-09 02:35

我来回答

3个回答

热心网友 时间:2022-04-09 04:04

Mono for
Android开发调研笔记

安装完Mono for Android(简称:MonoDroid)之后,可以用MonoDevelop或Visual Studio来开发Mono for
Android应用程序;目前只能在模拟器上调试和部署,必须购买后才能在真机上调试和部署;目前遇到的最大的问题是:模拟器上调试速度非常慢,通过单步调试每一行代码都需要几秒钟。有人开了个帖子抱怨以及一些回复的相关讨论:http://mono-for-android.1047100.n5.nabble.com/Free-version-Emulator-only-Bye-bye-td5091443.html,另外,如果购买了正式版,那支持直接用设备来调试的相关文章介绍:http://docs.xamarin.com/android/tutorials/debug_on_device

MonoDroid应用程序,应该说所有的Android应用程序只要在处理5秒后还未完成,则会自动提示用户“应用程序无响应,是否结束应用”类似这样的提示信息。所以我们一般在处理一些可能比较耗时的操作时,比如与服务器进行通信请求数据或Post数据。这里操作都需要通过异步的方式来完成;

MonoDroid提供的API与原生Java平台下的Android开发基本一致,类的名称以及方法名称都保持一致,这样只要会开发原生的Android应用,那在MonoDroid下也可以开发;

虽然说MonoTouch,
MonoDroid可以允许我们用C#来开发在IOS以及Android应用,但是并不是所有的代码都只要用c#写一次就可以在这两个平台上跑了。实际上,能重用的代码也许只有业务层的代码。因为UI的实现,两种平台不同,MonoDroid下依赖于Mono.Android来实现UI,而MonoTouch下则是用另外一套不同的UI实现方式。实际上Mono更多的是考虑了与原生API一致的方式来开发UI,所以设计了两套不同的类库来实现UI架构;所以UI层的代码无法重用;另外,数据访问层,也不能共用,因为虽然都是访问sqlite,但是Mono在这两个平台上分别对应实现的API不同,MonoTouch下使用:MonoTouch.CoreData,而MonoDroid下使用Mono.Data.Sqlite。当然我们还是可以将数据访问层进行抽象,比如抽象成IRepository,然后业务层调用IRepository的接口即可,IRepository的具体实现需要基于不同平台分别实现;

之前可以在Windows上跑的Castle框架在MonoDroid上不再支持,编译会遇到错误,因为Castle程序集依赖于System.Configuration这个程序集,但是在MonoDroid平台上没有这个程序集;MomoDroid平台上支持的.Net程序集有限,见下面的介绍。基于这个原因,但是又希望能像以前那样使用某个IOC框架,所以找了一个跨各种手机平台的轻量级开源Ioc框架(TinyIoC),该框架非常小,只有一个cs文件就能使用,使用后感觉效果还不错,基本容器功能都支持了。git开源项目地址:https://github.com/grumpydev/TinyIoC

log4net在MonoDroid上也不支持,因为:Log4Net uses classes in .Net namespaces such as
System.Web, and System.Diagnostics that are not yet implemented in Mono for
Android. 不过幸好,Android平台自带了一个Log记录器,在MonoDroid下可以使用Android.Util.Log来记录日志。如果是用Visual
Studio来开发,则可以直接在VS的Output窗口看到日志,另外VS还有一个专门的窗口(View -> Other Windows ->
Android Device Logging)用来查看Android记录的日志。另外,也可以通过命令行的方式查看日志,定位到目录:C:\Program
Files (x86)\Android\android-sdk\platform-tools,执行命令:adb
logcat,详细方法可以参考:http://docs.xamarin.com/android/advanced_topics/android_debug_log

MonoDroid的数据库是用sqlite,目前内置支持两种数据访问方式:原生方式(游标的方式)以及ADO.NET类似的接口,使用起来ADO.NET的方式非常简单,我们只需要引用:Mono.Data.SQLite这个程序集就能像ADO.NET那样来访问sqlite数据库了。

游标方式举例:

//查询数据

ICursor cursor = this.db.Query(DatabaseTable, new[] { KeyRowId, KeyTitle, KeyBody }, null, null, null, null, null);

//新增数据

var initialValues = new ContentValues();
initialValues.Put(KeyTitle, title);
initialValues.Put(KeyBody, body);
this.db.Insert(DatabaseTable, null, initialValues);

//更新数据

var args = new ContentValues();
args.Put(KeyTitle, title);
args.Put(KeyBody, body);
this.db.Update(DatabaseTable, args, KeyRowId + "=" + rowId, null);

//删除数据

this.db.Delete(DatabaseTable, KeyRowId + "=" + rowId, null);

//事务支持

this.db.BeginTransaction(); //Start a transaction.
try {
var result = func(); //Do update db operations.
db.SetTransactionSuccessful(); //tell db the update operations successfully.
return result;
} catch {
//Error in between database transaction
}finally {
//commit the transaction.
//if the setTransactionSuccessful method have not been called, then the transaction will auto rollback.
db.EndTransaction();
}

ADO.NET方式举例,(需要引用:Mono.Data.Sqlite)

//查询数据

public static IEnumerable<Note> GetAllNotes()
{
var sql = "SELECT * FROM ITEMS;";

using (var conn = GetConnection())
{
conn.Open();

using (var cmd = conn.CreateCommand())
{
cmd.CommandText = sql;

using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
yield return new Note(reader.GetInt32(0), reader.GetString(1), reader.GetDateTime(2));
}
}
}
}

//新增和更新数据

public static void SaveNote(Note note)
{
using (var conn = GetConnection())
{
conn.Open();

using (var cmd = conn.CreateCommand())
{

if (note.Id < 0)
{
// Do an insert
cmd.CommandText = "INSERT INTO ITEMS (Body, Modified) VALUES (@Body, @Modified); SELECT last_insert_rowid();";
cmd.Parameters.AddWithValue("@Body", note.Body);
cmd.Parameters.AddWithValue("@Modified", DateTime.Now);

note.Id = (long)cmd.ExecuteScalar();
}
else
{
// Do an update
cmd.CommandText = "UPDATE ITEMS SET Body = @Body, Modified = @Modified WHERE Id = @Id";
cmd.Parameters.AddWithValue("@Id", note.Id);
cmd.Parameters.AddWithValue("@Body", note.Body);
cmd.Parameters.AddWithValue("@Modified", DateTime.Now);

cmd.ExecuteNonQuery();
}
}
}
}

//删除数据

public static void DeleteNote(Note note)
{
var sql = string.Format("DELETE FROM ITEMS WHERE Id = {0};", note.Id);

using (var conn = GetConnection())
{
conn.Open();

using (var cmd = conn.CreateCommand())
{
cmd.CommandText = sql;
cmd.ExecuteNonQuery();
}
}
}

//事务支持

using (var conn = GetConnection ()) {
conn.Open ();
var transaction = conn.BeginTransaction();
try
{
//Do db operations.
transaction.Commit();
}
catch
{
transaction.Rollback();
}
}

ORM,NHibernate不能运行在Mono for
Android上,不过手机应用的业务逻辑相对简单,ORM的需求优先级应该不是很急,暂时可以通过上面的数据访问方式来访问sqlite数据库。

类库方面,目前支持的.net类库有限,主要有以下几个:

1 mscorlib
2 System 包含System.Net命名空间,支持HttpWebRequest, HttpWebResponse,这两个类可以实现与服务器端通信
3 System.Core 包含IO, LINQ, Collections,etc
4 System.Data 该类库实现了ADO.NET的相关基础架构,如DataReader, DataAdapter, Connection, Command, etc.
5 System.Data.Services.Client
6 System.EnterpriseServices
7 System.Json 提供了简单的JSON序列化和反序列化支持
8 System.Numberics
9 System.Runtime.Serialization
10 System.ServiceModel
11 System.ServiceModel.Web
12 System.Transactions 提供事务支持,包括分布式事务
13 System.Web.Services
14 System.Xml
15 System.Xml.Linq
16 Microsoft.CSharp
17 //以下几个是Android开发需要的类库
18 Mono.Android MonoDroid核心类库,该类库中提供的API与原生的JAVA API基本一致,所以使用起来很方便;
19 Mono.Android.Export
20 Mono.Android.GoogleMaps
21 Mono.Android.Support.v4
22 Mono.CompilerServices.SymbolWriter
23 Mono.CSharp
24 Mono.Data.SQLite 提供封装了Sqlite数据库的ADO.NET接口支持
25 Mono.Data.Tds
26 Mono.Security

与服务器通信,可以像平时一样通过HttpWebRequest或WebClient来发送请求。以下代码设计了一个通用的通过异步的方式发送HttpWebRequest

/// <summary>
/// 异步发送HttpWebRequest
/// </summary>
/// <param name="cookie"></param>
/// <param name="url"></param>
/// <param name="postData"></param>
/// <param name="callback"></param>
public static void SendHttpPostRequest(Cookie cookie, string url, string postData, Action<HttpWebResponse> callback)
{
//解决https下的证书问题
HttpRequestCredentialHelper.SetDefaultCredentialValidationLogic();
var request = HttpWebRequest.Create(url) as HttpWebRequest;
//设置请求类型为POST
request.Method = "POST";

//设置Post的数据
if (!string.IsNullOrEmpty(postData))
{
request.ContentLength = postData.Length;
request.ContentType = "application/x-www-form-urlencoded";
using (var writer = new StreamWriter(request.GetRequestStream()))
{
writer.Write(postData);
writer.Close();
}
}

//将Cookie放入请求,以让服务器知道当前用户的身份
var container = new CookieContainer();
request.CookieContainer = container;
if (cookie != null)
{
container.SetCookies(new Uri(Constants.ROOT_URL), string.Format("{0}={1}", cookie.Name, cookie.Value));
var logger = DependencyResolver.Resolve<ILoggerFactory>().Create(typeof(HttpWebRequestHelper));
logger.InfoFormat("HttpWebRequest CookieName:{0}, Value:{1}", cookie.Name, cookie.Value);
}

//异步发送请求
request.BeginGetResponse(new AsyncCallback(asyncResult =>
{
var httpRequest = asyncResult.AsyncState as HttpWebRequest;
using (var response = httpRequest.EndGetResponse(asyncResult) as HttpWebResponse)
{
callback(response);
}
}), request);
}

发送请求示例代码:

HttpWebRequestHelper.SendHttpPostRequest(null, url, postData,

response =>
{
var response = HttpWebRequestHelper.GetTextFromResponse(response);

//这里处理HttpWebResponse

//如果要反问UI相关元素,则需要封装为一个委托然后在RunOnUiThread方法内执行
RunOnUiThread(() =>
{
var folders = _taskFolderService.GetAllTaskFolders();
_listView.Adapter = new TaskFolderAdapter(this, Resource.Layout.TaskFolderListItem, folders.ToArray());
});
});

分层架构,我觉得我们可以采用以下的分层架构:

UI 界面层,MonoTouch,MonoDroid分别实现

Model
模型层,实现核心业务逻辑,代码可重用,如果采用DDD领域模型来实现,则可以包括:Service,Aggregate,Entity,VO,IRepository

Model.Infrastructure
基础框架层,实现公共基础代码,供上层调用,如DI,log,configuration,httprequest, constants, etc

Model.Repositories 仓储实现层,对Model层的IRepository接口的实现,不同平台采用不同实现

热心网友 时间:2022-04-09 05:22

QQapp开发的移动端也就几个人而已,你觉得momo需要多少。

热心网友 时间:2022-04-09 06:57

相对java来说算少。
LZ有兴趣可以加几个mono的群 人多了 讨论的也多 从安装到开发的问题都会有人帮忙。
哈~我也在学习mono for android
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
请问老鼠牙用什么方法治疗? 老鼠牙矫正费用 老鼠牙矫正需要多少钱 我的门牙长的像老鼠牙我25岁了能不能矫正 六月龄婴儿吃什么辅食 哪种辅食营养又好吃 跳舞毯的主要作用有哪些呢 用友ERP产品体系是什么 ...食品卫生许可证、食品流通许可证、QS证都有什么区别? 听说食品卫生许可证被取消了,现在QS生产许可证即包含了卫生许可证的相关... 请问移动wifi要怎么弄多少钱啊一个月 梦见和喜欢的人在一起搞卫生 梦见自己和临居坐火车上一起小便!粘到手上完事和亲同学一起洗手 梦见和女生一起洗手 12306的账号是什么啊? 远程教育最快拿到本科文凭要多久 网络远程教育好毕业吗?一般要多久毕业? 合肥最好的主题酒店是哪个 合肥天鹅湖大酒店的预订流程 合肥希尔顿酒店是几星际?(急) 求合肥希尔顿酒店住宿房间价格表?谢谢 合肥希尔顿酒店是几星级的? 那个合肥两淮豪生大酒店条件如何,好预订吗??? 好朋友12月4号就要结婚了,我12月.2号晚上梦到了参加她的结婚.做梦预示的着什么 合肥有适合办婚宴的酒店? 谁知道合肥希尔顿酒店,该怎么去预订呢? 合肥有哪些五星级宾馆,价格是多少? 合肥结婚酒店选哪个好?大家来推荐? 合肥oio酒店连锁酒店预订方式有哪些? maya的发展历史 合肥两淮豪生大酒店预订、电话、官网是什么? 姑姑给我做的朱砂包辟邪用的,我戴了好多天,可以给爸爸戴吗。谢谢各位了! 每晚都用朱砂包来辟邪,刚刚朱砂包怎么也找不见了 最好的辟邪方法是? 朱砂 辟邪 疑问 笔记本内置摄像头模组怎样转换成USB连接的? 笔记本内置摄像头和麦克风同时失效,如何修理 麻烦介绍一些定制工业摄像头模组的厂家。摄像头模组使用在一体机或笔记本电脑上。 笔记本的摄像头无法打开? 笔记本电脑摄像头处发热严重,摄像头打不开 我的笔记本电脑摄像头 和声卡不见了 笔记本内置摄像头带麦改成USB,怎么改?麦克风怎么接? 我的笔记本是TCL的有内置摄像头,不知道如何接外接摄像头?高手帮忙谢谢 摄像头模组 请问厦门金龙客车全系列的价格? 综合保险指的是什么 以“妈妈,你听我说”为题写一篇作文。600字左右。 综合保险是什么保险? 综合保险指的是什么意思 妈妈,您听我说作文500字左右初中 综合保险是指什么保险