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

转载随意!


目录
相关文章
|
开发框架 前端开发 Android开发
Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势
本文深入探讨了 Flutter 与原生模块(Android 和 iOS)之间的通信机制,包括方法调用、事件传递等,分析了通信的必要性、主要方式、数据传递、性能优化及错误处理,并通过实际案例展示了其应用效果,展望了未来的发展趋势。这对于实现高效的跨平台移动应用开发具有重要指导意义。
1725 4
|
数据库 Android开发
Android使用EditText+Listview实现搜索效果(使用room模糊查询)
本文介绍如何在Android中使用EditText与ListView实现搜索功能,并结合Room数据库完成模糊查询。主要内容包括:Room的模糊查询语句(使用`||`代替`+`号)、布局美化(如去除ListView分割线和EditText下划线)、EditText回车事件监听,以及查询逻辑代码示例。此外,还提供了相关扩展文章链接,帮助读者深入了解ListView优化、动态搜索及Room基础操作。
861 65
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
730 4
|
安全 数据库 Android开发
在Android开发中实现两个Intent跳转及数据交换的方法
总结上述内容,在Android开发中,Intent不仅是活动跳转的桥梁,也是两个活动之间进行数据交换的媒介。运用Intent传递数据时需注意数据类型、传输大小限制以及安全性问题的处理,以确保应用的健壯性和安全性。
773 11
|
人工智能 前端开发 API
Gemini Coder:基于 Google Gemini API 的开源 Web 应用生成工具,支持实时编辑和预览
Gemini Coder 是一款基于 Google Gemini API 的 AI 应用生成工具,支持通过文本描述快速生成代码,并提供实时代码编辑和预览功能,简化开发流程。
1420 38
Gemini Coder:基于 Google Gemini API 的开源 Web 应用生成工具,支持实时编辑和预览
|
存储 XML Java
Android 文件数据储存之内部储存 + 外部储存
简介:本文详细介绍了Android内部存储与外部存储的使用方法及核心原理。内部存储位于手机内存中,默认私有,适合存储SharedPreferences、SQLite数据库等重要数据,应用卸载后数据会被清除。外部存储包括公共文件和私有文件,支持SD卡或内部不可移除存储,需申请权限访问。文章通过代码示例展示了如何保存、读取、追加、删除文件以及将图片保存到系统相册的操作,帮助开发者理解存储机制并实现相关功能。
3213 2
|
前端开发 Java Shell
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
1151 20
【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
|
人工智能 搜索推荐 IDE
突破网页数据集获取难题:Web Unlocker API 助力 AI 训练与微调数据集全方位解决方案
本文介绍了Web Unlocker API、Web-Scraper和SERP API三大工具,助力解决AI训练与微调数据集获取难题。Web Unlocker API通过智能代理和CAPTCHA绕过技术,高效解锁高防护网站数据;Web-Scraper支持动态内容加载,精准抓取复杂网页信息;SERP API专注搜索引擎结果页数据抓取,适用于SEO分析与市场研究。这些工具大幅降低数据获取成本,提供合规保障,特别适合中小企业使用。粉丝专属体验入口提供2刀额度,助您轻松上手!
1009 2
|
XML JSON API
Understanding RESTful API and Web Services: Key Differences and Use Cases
在现代软件开发中,RESTful API和Web服务均用于实现系统间通信,但各有特点。RESTful API遵循REST原则,主要使用HTTP/HTTPS协议,数据格式多为JSON或XML,适用于无状态通信;而Web服务包括SOAP和REST,常用于基于网络的API,采用标准化方法如WSDL或OpenAPI。理解两者区别有助于选择适合应用需求的解决方案,构建高效、可扩展的应用程序。
|
Kubernetes 安全 Devops
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙
451 10
有效抵御网络应用及API威胁,聊聊F5 BIG-IP Next Web应用防火墙

热门文章

最新文章