Xamarin android 调用Web Api(ListView使用远程数据)

简介: xamarin android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问。xamarin android调用远程数据主要有两种方式:在Android中保存数据或调用数据库可以利用SQLite,android中提供了几个类来管理SQLite数据库,对数据进行增删改查直接调用Asp.net Web API对数据进行增删改查这两种方式到底选择哪一种方式好一点呢?哪一种方式好不好我不敢确定,市场上大部分app都是调用api来clud的。

xamarin android如何调用sqlserver 数据库呢(或者其他的),很多新手都会有这个疑问。xamarin android调用远程数据主要有两种方式:

  1. 在Android中保存数据或调用数据库可以利用SQLite,android中提供了几个类来管理SQLite数据库,对数据进行增删改查
  2. 直接调用Asp.net Web API对数据进行增删改查

这两种方式到底选择哪一种方式好一点呢?哪一种方式好不好我不敢确定,市场上大部分app都是调用api来clud的。当然我也推荐大家使用web api来调用远程数据,至少目前来看我们公司都是使用web api来做的。好吧废话不多说,下面就是ListView来调用web api执行增删改查的例子。

先看一下效果图:


这个示例我还是拿之前的listview入门的例子做, xamarin android listview的用法,数据是直接调用远程的web api中的数据。主要实现步骤

  1. 新建一个web api的项目,写好要用到的方法。
  2. 在MainActivity.cs中发送请求并将相应的json字符串序列化成List集合

 web api中的 NewsControl.cs

using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Web.Http;
using WebApi10_9.Models;
namespace WebApi10_9.Controllers
{
    public class NewsController : ApiController
    {
        List<News> list = new List<News>() {
              new News (1001,"加内特的历史地位能在NBA排第几,超越德国战车?",1200),
                new News (1002,"盘点新赛季最期待的十场比赛,无湖人比赛?",560),
                new News (1003,"库里新赛季铁定无缘常规赛MVP",158200),
                new News (1004,"我服,库里,杜兰特,汤普森谁才是出手的最佳选择",900),
                new News (1005,"易建联的出场时间你能猜出来吗,大概多少",960),
                  new News (1006,"卡戴珊三姐妹睡多少男人",960),
                  new News(1007,"科比退役后湖人到底失去多少中国的粉丝",4986),
                  new News(1008,"科比退役湖人签中国篮球当家背后隐藏了多少阴谋",65987)
       };
        public IEnumerable<News> GetAllNews()
        {
            return list;
        }
        [HttpGet]
        public List<News> Remove(int id)
        {
            var item = list.FirstOrDefault(p => p.Id == id);
            if (item == null)
               throw new HttpResponseException(HttpStatusCode.NotFound);
            list.Remove(item);
            return list;
        }
    }
}

MainActivity.cs

using Android.App;
using Android.Content;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.Collections.Generic;
using DrawerLayout.Adapter;
using Newtonsoft.Json;
using System.Net;
using System.Text;
using System.IO;
namespace DrawerLayout
{
    [Activity(Label = "ListViewDemo", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        int count = 1;
        private List<News> data;
        private Context context;
        private NewsAdapter adapter;
        private ListView lv_test;
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            //data = new List<News>() {
            //    new News (1001,"加内特的历史地位能在NBA排第几,超越德国战车?",1200),
            //    new News (1002,"盘点新赛季最期待的十场比赛,无湖人比赛?",560),
            //    new News (1003,"库里新赛季铁定无缘常规赛MVP",158200),
            //    new News (1004,"我服,库里,杜兰特,汤普森谁才是出手的最佳选择",900),
            //    new News (1005,"易建联的出场时间你能猜出来吗,大概多少",960),
            //      new News (1006,"卡戴珊三姐妹睡多少男人",960),
            //      new News(1007,"科比退役后湖人到底失去多少中国的粉丝",4986),
            //      new News(1008,"科比退役湖人签中国篮球当家背后隐藏了多少阴谋",65987)
            //};
            string url = "http://192.168.1.172:100/api/news";
            string content = AccessData.GetRouteData(url ); //接收到响应的json 字符串
            List<News> list = JsonConvert.DeserializeObject<List<News>>(content); //已经获取到远程数据的List<News>和之前的本地data就是一样的了。
            adapter = new NewsAdapter(list,this);
            lv_test = FindViewById<ListView>(Resource.Id.lv_test);
            View lv_header = LayoutInflater.Inflate(Resource.Layout.lv_header, null);
            lv_test.AddHeaderView(lv_header);
            lv_test.Adapter = adapter;
        }
        public class AccessData
        {
            public static string GetRouteData (string url)
            {
                //构建请求
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.ContentType = "text/json;chartset=UTF-8";
                //request.UserAgent = "";
                request.Method = "Get";
                //接收响应
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Stream stream = response.GetResponseStream();
                StreamReader streamReader = new StreamReader(stream, Encoding.UTF8);
                string retString = streamReader.ReadToEnd();
                return retString;
            }
        }
    }
}
当然还有一个单击删除的事件还没有写,这个在NewsAdapter.cs里面写。

        public override View GetView(int position, View convertView, ViewGroup parent)
        {
            convertView = LayoutInflater.From(context).Inflate(Resource.Layout.lv_test,parent,false);
            ViewHolder holder = null;
            if (convertView != null)
            {
                holder = new ViewHolder();
                holder.btn = convertView.FindViewById<Button>(Resource.Id.btn_delete);
                holder.title = convertView.FindViewById<TextView>(Resource.Id.tv_title);
                holder.pv = convertView.FindViewById<TextView>(Resource.Id.tv_pv);
            }
            else
            {
                convertView.Tag = holder;
            }
            holder.pv.Text = data[position].Pv.ToString();
            holder.title.Text = data[position].Title;
            holder.btn.Click += (s, e) => DeleteClick(data[position].Id,position);
            return convertView;
        }
        public void DeleteClick(int id,int position)
        {
            string url = "http://192.168.1.172:100/api/news/"+id;
            string content = AccessData.GetRouteData(url); //已经接收到响应的json 字符串 
            Toast.MakeText(context,data[position].Title+"删除成功",ToastLength.Short).Show();
            List<News> list = JsonConvert.DeserializeObject<List<News>>(content);
            data = list;
            NotifyDataSetChanged();
        }
    }
    public class ViewHolder:Java.Lang.Object
    {
        public TextView title;
        public TextView pv;
        public Button btn;
    }

好了,这样就大功告成了。那么问题来了,上面发送http请求,然后又接收响应再序列化,这还仅仅是一个简单的例子,要是复杂实用一点的话,要写很多很多代码,这里我推荐一个非常好的第三方组件,http请求响应第三方组件RestSharp用的非常广泛。用法很简单,看完这篇大概你就懂了 RestSharp的10分钟入门实例。我为什么推荐大家使用这个第三方组件呢,因为本屌所在公司也是用这个的,好东西,就是要懂得分享,当然那种直接利用HttpWebRequest ,HttpWebResonse对象来获取文件流再序列化成List集合的原始方法肯定是要知道的。直接上代码,结果还是一样的。哦,先先Nuget下载RestSharp 才能引用。


   protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            SetContentView(Resource.Layout.Main);
            string url = "http://192.168.1.172:100/api/news";
           <span style="color:#ff0000;"> var client = new RestClient(url);//创建客户端请求
            var request = new RestRequest();
            //RestResponse response = (RestResponse)client.Execute(request);
            //string responseStr = response.Content; 这两句获取json字符串,下面两句获取集合也很简洁
            IRestResponse<List<News>> responseList = client.Get<List<News>>(request);
            List<News> list = responseList.Data;</span>
            //string content = AccessData.GetRouteData(url ); //接收到响应的json 字符串
            //List<News> list = JsonConvert.DeserializeObject<List<News>>(content); //已经获取到远程数据的List<News>和之前的本地data就是一样的了。
            adapter = new NewsAdapter(list,this);
            lv_test = FindViewById<ListView>(Resource.Id.lv_test);
            View lv_header = LayoutInflater.Inflate(Resource.Layout.lv_header, null);
            lv_test.AddHeaderView(lv_header);
            lv_test.Adapter = adapter;
        }

删除也是差不多的,所以不贴了,只需要这几句就可以了实现发送请求接收响应了。大力推荐使用RestSharp。代码下载址: xamarin android listview调用web api

作者:张林

原文地址:http://blog.csdn.net/kebi007/article/details/52770808

转载随意!


目录
相关文章
|
3月前
|
前端开发 JavaScript Python
Python Web应用中的WebSocket实战:前后端分离时代的实时数据交换
在前后端分离的Web应用开发模式中,如何实现前后端之间的实时数据交换成为了一个重要议题。传统的轮询或长轮询方式在实时性、资源消耗和服务器压力方面存在明显不足,而WebSocket技术的出现则为这一问题提供了优雅的解决方案。本文将通过实战案例,详细介绍如何在Python Web应用中运用WebSocket技术,实现前后端之间的实时数据交换。
128 0
|
5月前
|
JSON 前端开发 JavaScript
|
5月前
|
编译器 API Android开发
Android经典实战之Kotlin Multiplatform 中,如何处理不同平台的 API 调用
本文介绍Kotlin Multiplatform (KMP) 中使用 `expect` 和 `actual` 关键字处理多平台API调用的方法。通过共通代码集定义预期API,各平台提供具体实现,编译器确保正确匹配,支持依赖注入、枚举类处理等,实现跨平台代码重用与原生性能。附带示例展示如何定义跨平台函数与类。
168 0
|
2月前
|
XML 前端开发 JavaScript
PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑
本文深入探讨了PHP与Ajax在Web开发中的交互技术。PHP作为服务器端脚本语言,处理数据和业务逻辑;Ajax则通过异步请求实现页面无刷新更新。文中详细介绍了两者的工作原理、数据传输格式选择、具体实现方法及实际应用案例,如实时数据更新、表单验证与提交、动态加载内容等。同时,针对跨域问题、数据安全与性能优化提出了建议。总结指出,PHP与Ajax的结合能显著提升Web应用的效率和用户体验。
70 3
|
3月前
|
Web App开发 Android开发
利用firefox调试安卓手机端web
该教程详细介绍如何通过Firefox浏览器实现手机与电脑的远程调试。手机端需安装最新版Firefox,并按指定步骤设置完成;电脑端则需安装15版及以上Firefox。设置完成后,通过工具栏中的“远程调试”选项,输入手机IP地址即可连接。连接确认后,即可使用电脑端Firefox调试器调试手机上的Web信息。注意,调试前手机需提前打开目标网页。
139 2
|
3月前
|
存储 前端开发 API
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
前端开发中,Web Storage的存储数据的方法localstorage和sessionStorage的使用及区别
174 0
|
4月前
|
开发框架 JSON 缓存
震撼发布!Python Web开发框架下的RESTful API设计全攻略,让数据交互更自由!
在数字化浪潮推动下,RESTful API成为Web开发中不可或缺的部分。本文详细介绍了在Python环境下如何设计并实现高效、可扩展的RESTful API,涵盖框架选择、资源定义、HTTP方法应用及响应格式设计等内容,并提供了基于Flask的示例代码。此外,还讨论了版本控制、文档化、安全性和性能优化等最佳实践,帮助开发者实现更流畅的数据交互体验。
115 1
|
3月前
|
存储 JSON 前端开发
JSON与现代Web开发:数据交互的最佳选择
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也便于机器解析和生成。它以文本格式存储数据,常用于Web应用中的数据传输,尤其是在客户端和服务器之间。
146 0
|
5月前
|
安全 关系型数据库 数据库
FastAPI数据库操作秘籍:如何通过高效且安全的数据库访问策略,使你的Web应用飞速运转并保持数据完整性?
【8月更文挑战第31天】在构建现代Web应用时,数据库操作至关重要。FastAPI不仅简化了API创建,还提供了高效数据库交互的方法。本文探讨如何在FastAPI中实现快速、安全的数据处理。FastAPI支持多种数据库,如SQLite、PostgreSQL和MySQL;选择合适的数据库可显著提升性能。通过安装相应驱动并配置连接参数,结合ORM库(如Tortoise-ORM或SQLAlchemy),可以简化数据库操作。使用索引、批量操作及异步处理等最佳实践可进一步提高效率。同时,确保使用参数化查询防止SQL注入,并从环境变量中读取敏感信息以增强安全性。
286 1
|
5月前
|
数据采集 定位技术 API
为什么要选住宅IP代理抓取Web数据?
在数据采集和Web爬虫领域,选择合适的IP代理至关重要。住宅IP代理因高隐蔽性和真实性、更好的访问成功率、能绕过反爬虫策略、多样化的地理位置、适应性和灵活性以及合法合规等优势,成为许多数据抓取项目的首选。使用住宅IP代理可提高数据抓取效率,降低被封禁风险,同时需遵守法律法规,确保活动的合法性与合规性。

热门文章

最新文章