[置顶] Xamarin android中使用signalr实现即时通讯
前面几天也写了一些signalr的例子,不过都是在Web端,今天我就来实践一下如何在xamarin android中使用signalr,刚好工作中也用到了这个,也算是总结一下学到的东西吧,希望能帮助你们,更快地熟悉使用xamarin android进行即时通讯。
先来看一下最终实现的效果:
这个简单的例子主要分为两部分:
1.一个Signalr web端提供访问的地址,也就是前面所写的例子 MVC中使用signalR入门教程。发布这个web网页,为Xamarin android的signalr客户端 提供一个url地址连接
2. xamarin android 中引入signalr.client 库,通过连接web地址发送消息,接收消息。
1.发布web网站提供地址
2.新建xamarin android项目引入Signalr.Client 库
Exception while loading assemblies: System.IO.FileNotFoundException: Could not load assembly 'System.Net.Http.Extensions, Version=1.5.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. Perhaps it doesn't exist in the Mono for Android profile?
文件名:“System.Net.Http.Extensions.dll”
在 Xamarin.Android.Tuner.DirectoryAssemblyResolver.Resolve(AssemblyNameReference reference, ReaderParameters parameters)
在 Xamarin.Android.Tasks.ResolveAssemblies.AddAssemblyReferences(ICollection`1 assemblies, AssemblyDefinition assembly, Boolean topLevel)
在 Xamarin.Android.Tasks.ResolveAssemblies.Execute()
这个错误说明signalr.client 在xamarin android支持的还不够好,今天厂里的牛哥说是nuget上面引入库不兼容,所以只能在xamarin官网上下载后引入。如果你们也是这样的错误,可以下载这个示例xamarin
signalr入门例子,引入里面的signalr.client 库。开发xamarin android项目的时候总会碰到很多小错误,虽然不是什么大bug,但是目前圈子很小,百度能解决的不是很多,有基础的话逛逛StackOverflow 还是不错的选择。有些小错误,能真是能让你喝一壶的.....,
引入好signalr.client 之后,新建一个类SignalrChatClient这是这个即时通讯的桥梁,as shown in the figure
3.SignalrChatClient负责创建、发送消息、接受消息的方法
SignalrChatClient.cs,代码如下
using System;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR.Client;
namespace SignalrClientDemo
{
public class SignalrChatClient
{
private readonly HubConnection _connection;
private readonly IHubProxy _proxy;//客户端代理服务器端中心
public event EventHandler<string> OnReceiveEvent; //定义一个接收server端的事件
public SignalrChatClient()
{
_connection = new HubConnection($"http://192.168.16.137:400");
_proxy = _connection.CreateHubProxy("serverHub");
}
//负责连接的方法
public async Task Connect()
{
await _connection.Start();
_proxy.On("showMessage", (string platform,string msg) =>
{
OnReceiveEvent(this,platform+":" +msg);
});
}
public Task Send(string message)
{
string serverMethod = "sendMsg"; //serverHub中定义的server端方法名称
if (_connection.State != ConnectionState.Connected)
{
Console.WriteLine("未连接");
return null;
}
Console.WriteLine("已连接");
return _proxy.Invoke(serverMethod,message);//Invode the 'SendMessage' method on ther server
}
}
}
4.最后一步Activity的布局和使用SignalrChatClient
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<EditText
android:id="@+id/et_msg"
android:layout_width="match_parent"
android:textColor="#ff0000"
android:layout_height="50dp" />
<Button
android:id="@+id/MyButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/Hello" />
<ListView
android:id="@+id/lv_msg"
android:layout_width="match_parent"
android:layout_height="30dp" />
</LinearLayout>
MainActivity.cs
using Android.App;
using Android.Widget;
using Android.OS;
namespace SignalrClientDemo
{
[Activity(Label = "SignalrClientDemo", MainLauncher = true, Icon = "@drawable/icon")]
public class MainActivity : Activity
{
int count = 1;
protected override async void OnCreate(Bundle bundle)
{
base.OnCreate(bundle);
SetContentView(Resource.Layout.Main);
Button button = FindViewById<Button>(Resource.Id.MyButton);
EditText et_msg = FindViewById<EditText>(Resource.Id.et_msg);
ListView lv_msg = FindViewById<ListView>(Resource.Id.lv_msg);
SignalrChatClient client = new SignalrChatClient();
await client.Connect();
var adapter = new ArrayAdapter(this,Android.Resource.Layout.SimpleListItem1);
string msg = et_msg.Text;
//发送消息
button.Click += delegate {
client.Send(msg);
et_msg.Text = string.Empty;
};
lv_msg.Adapter = adapter;
//使用委托接收消息
client.OnReceiveEvent += (sender, message) => RunOnUiThread(() =>
{
adapter.Add(message);
});
}
}
}
实现了这个效果聊天的效果之后,会发现这xamarin android客户端使用signalr实现即时通讯的方式和mvc里的差不多,方式其实是一样的,客户端发送的消息的事件也是要调用服务器端的serverHub类中方法sendMsg,接收消息同样是在委托里定义服务器端中声明的客户端方法showMessage.原理很相似。最近工作之余不是很忙,准备写一个聊天的xamarin android项目出来,希望能快点做出来吧。
例子下载地址:xamarin signalr入门例子
作者:张林
标题:Xamarin android中使用signalr实现即时通讯 原文地址:http://blog.csdn.net/kebi007/article/details/53544379
转载随意注明出处
[置顶] Xamarin android中使用signalr实现即时通讯的更多相关文章
- [置顶]
xamarin android使用gps定位获取经纬度
看了文章你会得出以下几个结论 1.android定位主要有四种方式GPS,Network(wifi定位.基站定位),AGPS定位 2.绝大部分android国产手机使用network进行定位是没有作用 ...
- [置顶]
xamarin android使用zxing扫描二维码
好久没写了,这片文章篇幅不长,概述一下在xamarin android中用 ZXing.Net.Mobile库扫描二维码读取url的示例.扫码支付,扫码登录,App上各种各样的扫码,好像没个扫码的就有 ...
- [置顶]
Xamarin android如何调用百度地图入门示例(一)
在Xamarin android如何调用百度地图呢? 首先我们要区分清楚,百度地图这是一个广泛的概念,很多刚刚接触这个名词"百度地图api",的确是泛泛而谈,我们来看一下百度地图的 ...
- [置顶]
xamarin android toolbar(踩坑完全入门详解)
网上关于toolbar的教程有很多,很多新手,在使用toolbar的时候踩坑实在太多了,不好好总结一下,实在浪费.如果你想学习toolbar,你肯定会去去搜索androd toolbar,既然你能看到 ...
- [置顶]
xamarin android自定义标题栏(自定义属性、回调事件)
自定义控件的基本要求 这篇文章就当是自定义控件入门,看了几篇android关于自定义控件的文章,了解了一下,android自定义控件主要有3种方式: 自绘控件:继承View类,所展示的内容在OnDra ...
- [置顶]
xamarin android自定义spinner
以前弄的一个下拉框时自带的spinner,感觉好丑,实际效果实在满足不了基本的UI界面要求,还是自己动手丰衣足食,看了网上关于android中自定义spinner的文章,感觉实现原理还是比较简单,所以 ...
- [置顶]
xamarin android 布局尺寸了解
为了使UI界面在不同大小的移动端显示器上能够正常显示,大家可能都知道使用sp作为字体大小的单位,dp作为其他元素长度的单位. 前几天看了一篇文章关于 App设计规范的,文章用心写的非常好,这里是链接 ...
- [置顶]
xamarin android Fragment实现底部导航栏
前段时间写了篇关于Fragment的文章,介绍了基础的概念,用静态和动态的方式加载Fragment Xamarin Android Fragment的两种加载方式.下面的这个例子介绍xamarin ...
- [置顶]
Xamarin Android安装教程(2016最新亲测安装版)
写这篇安装教程前要说的几句话 之前很多人想用Vs来开发Android项目,苦于这个环境的安装.的确这并不是一件简单的事情,并不是开发者都能在花一上午能装好,如果你花了一天时间,第一个Xamarin ...
随机推荐
- 这些工具对html5开发有很大帮助
如今H5已经在IT这块很热门,所以也就有越来越多的人自学或是报名培训班学习H5,今天写一篇关于当下html5开发工具有哪些?哪个更好一些? 浅谈2017年html5开发工具哪个好: 1.Adobe D ...
- ABAP 7.52 中的Open SQL新特性
S/4 HANA 1709 已经在几个月前发布,随之而来的是ABAP 7.52. 本文翻译了更新文档中有关Open SQL的部分 本文链接:http://www.cnblogs.com/hhelibe ...
- python爬虫实战 获取豆瓣排名前250的电影信息--基于正则表达式
一.项目目标 爬取豆瓣TOP250电影的评分.评价人数.短评等信息,并在其保存在txt文件中,html解析方式基于正则表达式 二.确定页面内容 爬虫地址:https://movie.douban.co ...
- 快速搭建一个本地的FTP服务器
快速搭建一个本地的FTP服务器 如果需要开发FTP文件上传下载功能,那么需要在本机上搭建一个本地FTP服务器,方便调试. 第一步:配置IIS Web服务器 1.1 控制面板中找到"程序& ...
- yii2.0中添加二维数组,多条数据。
/** * @inheritdoc 批量添加 * @params $add array 添加数据 */public function add_all($add){ $connection = \Yii ...
- Java集合(5)一 HashMap与HashSet
目录 Java集合(1)一 集合框架 Java集合(2)一 ArrayList 与 LinkList Java集合(3)一 红黑树.TreeMap与TreeSet(上) Java集合(4)一 红黑树. ...
- 1、C#基础 - C# 语言简介
C# 语言和 .NET Framework 介绍 C# 是类型安全的面向对象的精妙语言,可帮助开发者生成在 .NET Framework 上运行的各种安全可靠的应用程序. C# 可用于创建 Windo ...
- 对于vue.js初步了解
由于本人做的是javaWeb的开发,对于前端的了解还是有限,今天对于vue.js了解了下(主要是看官方api),把自己的心得说一下,希望各位大神可以补充,谢谢 http://www.runoob. ...
- Python笔记·第六章——字典 (dict) 的增删改查及其他方法
字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据.python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可 ...
- 从源代码到Runtime发生的重排序
源代码和Runtime时执行的代码很可能不一样,这是因为编译器.处理器常常会为了追求性能对改变执行顺序.然而改变顺序执行很危险,很有可能使得运行结果和预想的不一样,特别是当重排序共享变量时. 从源 ...