UWP 拉勾客户端

前些天, 用 Xamarin.Forms (XF) 将就着写了个拉勾的 UWP 和 Android 的客户端.

XF 对 Android  和 IOS 的支持做的很到位, 但是对 UWP 的支持目前仅限于预览版, "预留" 了很多BUG.

本想着等 Xamarin 团队尽快发部更新, 我好改掉这些 BUG, 但是苦等了个把月, 发部的 DLL 不但没有修改我所遇到的这些 BUG, 反而 BUG 越来越多了...

算鸟, 我也不等你了, 直接新开个项目, 直接写个 UWP 的...

源码

https://github.com/gruan01/Lagou.UWP

体验包

http://pan.baidu.com/s/1gei4V3l

安装步骤:

更新和安全->勾选开发人员模式-> 启用USB 和局域网连接,身份验证

然后在浏览器里输入手机上显示的地址,

点击 App Package 下面的那个按钮, 选择下载的 .appxbundle 文件 (你也可以用解压软件打开该文件, 里面包含 appx 文件).

点击 Go.

完成功能:

目前只写了 搜索 / 查看 / 及收藏到本地, 另外还有一个登陆查看简历的功能.

官方 app 中的 "发现" , 没有发现入口在哪里, 所以留白.

我的信息中, 除我的简历外, 其它都留白, 因为我没有可用数据可供调试.

已知 BUG :

登陆状态不准确.

截图:

问题与解决

1, Caliburn.Micro 和 NavigationCacheMode

如果页面的 NavigationCacheMode 设为 Enabled 或 Required, Caliburn.Micro 的 Message.Attach 会多次绑定, 导至事件处理方法被多次调用 (导航到其它页面, 在返回, 在导航,在返回, 问题就出来了).

除了等大神修复这个 BUG 外, 用 Command / Behavior / Attached Property 都可以解决这个问题.

2, 返回时, ListView  无法定位到离开之前的位置.

这个问题有两种解决办法:

a, 设置页面的 NavigationCacheMode 为 Enabled 或 Required.

b, 对于不方便使用 NavigationCascheMode 的页面, 参照 Windows-universal-samples 中的 ListView 相关的示例, 我写了一个 ListViewPositionRestoreBehavior:

https://github.com/gruan01/Lagou.UWP/blob/master/Lagou.UWP/Common/ListViewPositionRestoreBehavior.cs

具体就是在 ListView 的 UnLoad 事件中, 获取某个 item 的 Key (至于是哪个, 没有细研究),  这个 Key 由 ListView 每数据中的可以做唯一标识的数据编码而得.

在 ListView.Loaded 事件, 获取已存在的 Key, 还原出唯一标识, 然后根据这个标识找到相关的 item.

1             <ListView ItemsSource="{Binding Datas}">
2                 <!--设置 Page 的 NavigationCacheMode 为 Enable 或 Required, 页面会被缓存,就不需要这个了 -->
3                 <i:Interaction.Behaviors>
4                     <common:ListViewPositionRestoreBehavior
5                      Identity="{Binding KeyFinder}"
6                      PersistedItemKey="{Binding PersistedItemKey, Mode=TwoWay}"
7                     />
8                 </i:Interaction.Behaviors>

ViewModel:

 1         #region used for ListView Position Restore
 2         public Func<object, string> KeyFinder { get; set; }
 3             = o => {
 4                 var item = (SearchedItemViewModel)o;
 5                 if (item != null) {
 6                     return item.Data.PositionId.ToString();
 7                 }
 8                 return string.Empty;
 9             };
10
11         public string PersistedItemKey { get; set; }
12         #endregion

3, 图片

不得不说, 拉勾的 图片是专坑你流量的. 根本就没有经过优化 (至少在 WAP 版中是这样的), 随便找个公司的 LOGO, 都是 二三十K, 几百乘几百的分辨率, 在手机上根本就是浪费内存,别无它用.

浪费流量, 这个没有办法, 因为没有其它的图可用..

至于分辨率, 一开始, 我写了个 ThumbImageSource ,  专门用于将大图改成小图, 但是运行发现有些多线程的问题没有处理好, 在 UWP 上又不比桌面环境, 有诸多限制, 对 UWP的整个 API 还不甚了解.

比如:

BitmapEncoder 居然无法写入 MemoryStream 转换出的 IRandomAccessStream , 用 StorageFile.OpenFile 生成的 IRandomAccessStream 却可以顺利写入..

不同的 BitmapPixelFormat 对应的 pixels bytes 数组大小还不一样, 又没有一个详细的文档说明...

网上搜索到贴子, 很多都是 WP 8.1 时代的 UAP 的 示例, UWP 并不适用...能写出以下代码, 真的是翻了好几天的贴子, 试了又试:

 1 private async Task<Stream> CreateThumb(Stream orgStm, int width, int height, string filePath) {
 2
 3             var ras = orgStm.AsRandomAccessStream();
 4             var wb = new WriteableBitmap(width, height);
 5             ras.Seek(0);
 6             await wb.SetSourceAsync(ras);
 7
 8             var stm = wb.PixelBuffer.AsStream(); //需要引用 System.Runtime.WindowsRuntime, NUGET 中有
 9             var bytes = await stm.GetBytes();
10
11             using (var fs = await FileManager.Instance.Value.OpenFile(filePath)) {
12                 //BitmapEncoder 无法写入 MemoryStream
13                 BitmapEncoder encoder = await BitmapEncoder.CreateAsync(
14                     BitmapEncoder.JpegEncoderId,
15                     fs);
16
17                 encoder.BitmapTransform.ScaledWidth = (uint)width; // 最终的图片的大小
18                 encoder.BitmapTransform.ScaledHeight = (uint)height;
19                 //encoder.BitmapTransform.Rotation = BitmapRotation.Clockwise90Degrees;
20
21                 encoder.SetPixelData(
22                     BitmapPixelFormat.Bgra8,
23                     BitmapAlphaMode.Straight,
24                     (uint)wb.PixelWidth,
25                     (uint)wb.PixelHeight,
26                     96.0,
27                     96.0,
28                     bytes);
29
30                 await encoder.FlushAsync();
31                 return fs.CloneStream().AsStream();
32             }
33         }

最后, 放弃了 ThumbImageSource, 使用了这两个属性: DecodePixelHeight / DecodePixelWidth , 图片分辨的问题得以轻松解决,内存占用平滑多了!

1 <ImageBrush.ImageSource>
2       <BitmapImage UriSource="{Binding Data.CompanyLogoUri}"
3                    DecodePixelHeight="100" DecodePixelWidth="100"
4                    />
5 </ImageBrush.ImageSource>

4, 消息订阅与发布

Xamarin.Forms 中实现了一个叫 MessagingCenter 的东西,方便在不同的页面中传递数据.

直接的 UWP项目, 当然不可能使用 Xamarin.Forms, 也就无从使用这个 MessagingCenter , 好在 Caliburn.Micro 也提供了这样一个机制, 省了不少事呢!

发布者:

a, 首先在事件聚合器中注册发布者:

1         public JobDetailViewModel(INavigationService ns, IEventAggregator eventAggregator) {
2             this._eventAggregator = eventAggregator;
3             this._eventAggregator.Subscribe(this);
4             ....

b, 发布一个消息:

1         private async Task AddFavorite() {
2             await this._eventAggregator.PublishOnUIThreadAsync(this.Data);
3         }

接收者:

a, 同样也需要在事件聚合器中对接收者进行注册.

b, 接收消息, 需要实现 IHandle 事件:

public class LocalFavoriteViewModel : BasePageVM, IHandle<Position> {
....
....
        public async void Handle(Position arg) {
            var tip = "";
            if (!this.Favorites.Any(f => f.PositionID == arg.PositionID)) {
                var d = this.Convert(arg);
                this.Datas.Add(new SearchedItemViewModel(d, this.NS));
                this.AddToFavorite(arg);
                ......
        }

------------------

OK ,完

欢迎 UWP 开发者共同完善这个 APP.

时间: 2024-10-12 15:53:19

UWP 拉勾客户端的相关文章

使用nodejs爬取拉勾苏州和上海的.NET职位信息

最近开始找工作,本人苏州,面了几家都没有结果很是伤心.在拉勾上按照城市苏州关键字.NET来搜索一共才80来个职位,再用薪水一过滤,基本上没几个能投了.再加上最近苏州的房价蹭蹭的长,房贷压力也是非常大,所以有点想往上海去发展.闲来无聊写了个小爬虫,爬了下苏州跟上海的.NET职位的信息,然后简单对比了一下. 是的小弟擅长.NET,为啥用nodejs?因为前几天有家公司给了个机会可以转nodejs,所以我是用来练手的,不过后来也泡汤了,但是还是花两晚写完了.刚学,代码丑轻喷哈! 一:如何爬取拉勾的数据

爬取拉勾部分求职信息+Bootstrap页面显示

今天在用python实现爬虫的时候,就想看一下用c#实现同样的功能到底会多出来多少code,结果写着写着干脆把页面也简单的写一个出来,方便调试, 大致流程如下: 1.分析拉勾数据 2.查找拉勾做了哪些反爬虫限制 3.抓取数据,show page 过程中用到一个HtmlAgilityPack第三方库,获取热门城市的时候使用XPath表达式抓取数据 解析JSON使用的是JSON.NET,一如既往的好用 github:https://github.com/hxd1230/XD.Job.Spider.g

模拟拉勾鼠标移入效果1

今天逛拉勾,发现一个漂亮的效果,晚上按捺不住,自己尝试敲了出来,以便日后温故知新. <!-- 你的html代码,以下是样板 --> <!doctype html> <h1>测试一口吧!</h1> 运行代码

拉勾上的一道题目

在拉勾上看到一道题目,或许有很多精妙的做法,欢迎讨论,集思广益.题目如下: FizzBuzzWhizz你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏.此时有100名学生在上课.游戏的规则是: 1. 你首先说出三个不同的特殊数,要求必须是个位数,比如3.5.7. 2. 让所有学生拍成一队,然后按顺序报数. 3. 学生报数时,如果所报数字是第一个特殊数(3)的倍数,那么不能说该数字,而要说Fizz:如果所报数字是第二个特殊数(5)的倍数,那么要说Buzz:如果所报数字是第三个特殊数

js 也来 - 【拉勾专场】抛弃简历!让代码说话!

前些日子谢亮兄弟丢了一个链接在群里,我当时看了下,觉得这种装逼题目没什么意思,因为每种语言都有不同的实现方法,你怎么能说你的方法一定比其他语言的好,所以要好的思路 + 好的语言特性运用才能让代码升华. 题目如下:<[拉勾专场]抛弃简历!让代码说话!> ? FizzBuzzWhizz 你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏.此时有100名学生在上课.游戏的规则是: 1. 你首先说出三个不同的特殊数,要求必须是个位数,比如3.5.7. 2. 让所有学生拍成一队,然后按顺序

前程无忧投资拉勾有着如何“不可告人”的秘密?

今天互联网圈最大的新闻,就是前程无忧1.2亿美金投资了拉勾.在互联网圈,很多人都知道拉勾,但很少人关心前程无忧. 这种上古时代的网站谁还用呢?为什么一家公司可以拿出将近10亿现金?后来扒了一下他们的财报,发现简直是闷声赚大钱的典范. 今天还没看到一篇文章分析前程无忧,我就写了一些零碎的点,希望能帮大家看懂前程无忧这家神奇的公司. 1.我记得前程无忧1999年已经在了,属于恐龙级别的互联网公司.但他们并不是和恐龙一样的结局.2016财年,前程无忧净利润率为33%,这是什么概念呢?除了腾讯阿里网易,

python3抓取到的拉勾数据统计

趁着最近有时间写了个拉勾爬虫抓取了后端.前端和移动端技术岗位的数据,总共大约6多万条记录,对其取前十名进行统计 按地域划分: 可以看出北上广深杭的数量远远超出其它城市,机会相对较多 2. 按融资阶段来看: 初创型未融资的居多,已上市及A轮的差不多,C轮是最少的,难道就是传说中的C轮魔咒 3. 按所需最低学历来看: 本科占绝对主力,大专次之,看来这行还是有一定的门槛 4. 按行业领域来看: 移动互联网占绝对统治地位,这是响应"大众创业,万众创新"的互联网+? 5. 按职位类型来看: 0,

程序员的进化 - 在拉勾1024程序员节上的演讲

注:以下本文来自于我在拉勾网1024程序员节上的现场演讲. 我是蒋宇捷,信天创投的合伙人,之前是百度魔图的联合创始人. 我先做个自我介绍,其实每次介绍自己其实是很痛苦的事情,因为我前不久在拉勾的分享刚刚介绍过.开个玩笑,我希望再过几年,只要站到这里大家都认识我,不用再做自我介绍,这才是我的人生目标. 王啸刚才分享的经历非常直接,创业成功就开始做天使投资.我的经历比较类似,但是更曲折,工作7年,经历过4家公司. 我最开始在傲游,是创业团队的第11号员工,在这家公司呆了3年的时间.后来2010年我去

网易考拉Android客户端网络模块设计

本文来自网易云社区 作者:王鲁才 客户端开发中不可避免的需要接触到访问网络的需求,如何把访问网络模块设计的更具有扩展性是每一个移动开发者不得不面对的事情.现在有很多主流的网络请求处理框架,如Square公司的OkHttp,Google推出的Volley,还有在OkHttp基础上进行封装的Retrofit等,这些都是非常优秀的网络处理框架.利用现有网络处理框架,比从零开始设计.开发网络请求节省很多开发时间,同时也避免了一些意想不到的问题.如果把这些框架直接拿来使用,不进行任何二次封装,会使我们工程