开源夏令营第五周--中期总结

不知不觉已经过了近一个月,这一个月中收获了太多,成长了不少,终于从一个24K纯小白蜕变成一个稍微知道点什么的小白..

所以,再次感谢CSDN给了我这个平台,让我跨入了一个新的境界,结识了更多的大牛,和IT圈子更近了一步。同时也是第一次在github上跟外国友人讨论代码,修改代码,第一次真正地体会到开源。学习的过程并不十分顺利,也有几次险些把代码完全搞丢,我觉得这些都是成长的必经之路。同时更要感谢林老师,这些日子来高频率的邮件交流,以及各方面的指导,提意见,也真是辛苦你了。

闲言少叙,总结开始


当我们在给程序添加功能时,一定要充分的了解这个程序的整个作用过程,决不能想当然地去写,否则会酿成大错。当我接手这个项目时的确有点轻敌了,乍看项目要求并不难,但却不知道水很深。虽说seadroid是seafile在安卓上的支持,但是seadroid完全不能脱离整个seafile,给服务器传参,调用web-api才是整个seadroid的灵魂。估计很多人像我一样当初看见复制、移动删除操作首先想到的就是用File类来解决,但通过数次的跟导师交流才发现自己实在是Naive。最初的一周我是在读整个程序的代码,对于一个新手来说,seadroid的代码的确写的很飘逸。从程序表面上来看,程序的功能并不是很多,但是在程序的内部,却充斥着很多表面上看不到的后台代码,整个程序都在围绕HTTP操作展开,并且伴有很多安全方面的代码。还有很多线程的操作,这些都是新手容易忽略的问题,同时更是新手容易犯的问题。


1.1 删除一个文件或文件夹

当初导师给我的意见是让我参照rename的方法来写。不得不说,要是没有rename,让我从零开始,我真不知道如何迈出第一步。所以,就像葛平老师说的,学艺要从模仿开始。因为整个seadroid都是围绕web-api来展开,所以首先要参考seafile服务器提供的web-api,根据web-api要求的参数来写代码。这个操作的正确思路是首先要添加delete按钮,当按钮被触发时记录当前的资料库ID(repoID)、被删除文件的路径(path)和是否是文件夹(isdir)一并传入到BrowserActivity中,并且在BrowserActivity中新开一个Dialog,弹出一个对话框。对话框有两个作用,其一是向用户确认是否要删除,其二便是将接下来的操作放入到AsyncTask线程中(为什么要放入这个线程我在第四周的文章有注明),并将这些参数转入到DataManager,让DataManager进行综合调度:首先向SeafConnection传参,发起服务器请求,然后将服务器返回的更新后的文件列表接受,更新本地数据库,操作完成。文件夹操作同理。

刚开始,我这个小白被这些参数传来传去搞得晕晕乎乎,并且很不理解为什么要搞得如此麻烦。但现在在回顾一下,每个步骤都有它存在的理由,而且若是将一些步骤简化,单独对这个操作而言貌似是可行的,但对整个程序而言却是致命打击,会显得整个程序混乱不堪,阅读起来十分不方便。所以我还是认为,一个程序的架构好坏直接决定了这个程序的逼格(由此联想到我曾经写的那个混乱不堪的下载器……


1.2复制移动一个文件或文件夹

既然导师把这两个操作放在一起必定是有他的理由的。因为这两个操作都涉及到多个资料库的变动,所以要弹出一个新的窗口要用户来选择目标路径。前几步的操作和删除操作一样,但是要新写一个Activity来代替弹出的dialog。这个Activity要逐次弹出合适的资料库、文件夹来让用户选择路径。当用户选择好后,记录下目标资料库(dst_repo)目标文件夹(dst_dir),并且配合最开始记录的参数一并传入到DataManger里,向服务器发出请求,获取回执的文件列表。文件夹操作同理

看似思路清晰完整,但是必须要注意:

1. 在弹出资料库时要进行筛选,根据此资料库是否加密、目标资料库是否有写入的权限只显示可以进行复制、移动的资料库,具体问题解决详见我的文章copy、move操作Plus

2. 直到用户选择完目标资料库(dst_repo)目标文件夹(dst_dir)后,这些操作都是在主线程(MainThread)中完成的,而服务器传参必须放入AsyncTask线程中,这样就需要新写一个从AsyncTask派生出来的函数来执行DataManger等操作。

3. 获得回执的文件列表一定要分清楚是回执的具体哪个资料库哪个文件夹的文件列表,否则会造成文件混乱。


2.1在某个文件夹下拍照并自动上传

由于拍照功能十分的常见,很多APP中都用到了这个功能,所以网上的资源相当的丰富。基本上都是调用手机自带的相机app,这样会减少很多不必要的错误。但是要注意的是,当我们搜到网上的资源后一定要针对我们自己的程序做严谨的修改。在seadroid中,我在BrowserActivity新写了个函数来调用相机api,并用函数startActivityForResult来执行相机app,将需要的参数(这里是拍得的照片的完整路径)返回至onActivityResult中。然后再调用UploadTask函数完成向服务器的上传。具体代码和操作详见我的文章拍照并上传操作


一些项目的题外话:

这些天来除了安卓开发技能的长进,对于开源项目的感悟也对我影响颇深。比如很多优秀的开源项目都是由各国各地优秀的程序员来贡献代码的,所以我们在交流、在写注释时就应该试着去使用英文。其次,由于很多人的开发平台不同,我们应该培养良好的代码习惯,比如要用space来替代tab键来缩进(我深受其害...),对于一些错误代码、result代码应该去定义易读的常量来代替不知所云的阿拉伯数字。并且如果其他文件中已定义了常量就不应再定义,宁可多import一个文件,多写几个字母也要保持一致,这样对于读代码的人而言十分方便查找。总的来说,开源的项目就应该考虑更加周全,更多的为读者,为其他人着想。

除此之外,git这些基本功必须要扎实,这也是我将来长久以来一直要加强的技能(因为感觉git的水更深...)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值