开源夏令营第四周-copy、move操作

来源:互联网 发布:权力的游戏大麻雀知乎 编辑:程序博客网 时间:2024/05/21 10:37

copy和move操作乍听起来很简单,但是当真正去实现时却发现并没有那么容易。原本打算制作一个粘贴按钮,当用户激活这个按钮时,记录当前的路径,进行web-api传参。但是林老师说这样操作不够人性化,要弹出个窗口让用户去选择要复制到的地址,这样功能的难度就加大了一些。虽然整个实现过程磕磕绊绊,但总体来说我学到了不少东西。

首先最直观的就是UI问题。要弹出一个供用户选择的窗口,毫无疑问的要添加一个Activity(Activity也是安卓的灵魂之一,前几日对其了解并不全面,搜索了很多资料恶补了一下),并且要在AndroidManifest.xml中声明新建的Activity,以便在其他Activity中调用。其中要涉及到的一些参数可以参考这篇文章: http://www.cnblogs.com/Android_2011/archive/2011/06/12/2078643.html  而这个Activity的布局,各个list、button的实现也应该要和MainActivity要一致,于是便可以比葫芦画瓢地写个xml。

然后便是后台代码问题。当用户在MainActivity中点击copy或move按钮后,我们要记录下被copy或move的文件路径、文件名以及资料库ID,为最后一步的web-api传参做准备。在我们新建的Activity中要读copy、move的目地资料库ID、文件路径。只有将这些参数收集齐全方可对web-api传参。于是便用到不同Activity间的传参操作:intent.putExtra("name", value);  但是在安卓中,只是put操作并无法将参数传入,在新建的Activity中要进行intent.getExtras()操作。对于不同类型的参数,intent.getExtras()调用的函数也不同,不仅如此,在进行copy、move操作中还要传递一个自定义类型的参数Account(用户的登录账户),对于这些操作,我参考了 http://blog.csdn.net/xymyeah/article/details/8122475 这篇文章,里面对不同类型的传参写的很详细,此处不再赘述。唯一补充的一点是,在获取布尔型参数时使用的函数为intent.getExtras().getBoolean("XX");,很多文章并未提及,在此补充下。

eg:

put:

intent.putExtra("repoName", repoName);        intent.putExtra("repoID", repoID);        intent.putExtra("path", path);        intent.putExtra("filename", filename);        intent.putExtra("mAccount", account);        intent.putExtra("isdir", isdir);        intent.putExtra("isCopy", false);
get:

Intent intent = getIntent();        this.repoID = intent.getStringExtra("repoID");        this.repoName = intent.getStringExtra("repoName");        this.path = intent.getStringExtra("path");        this.filename = intent.getStringExtra("filename");        this.mAccount = (Account)intent.getParcelableExtra("mAccount");        this.isdir = intent.getExtras().getBoolean("isdir");        this.isCopy = intent.getExtras().getBoolean("isCopy");

在新建的Activity中,受林老师的指点,我是分步实现的,第一步设置好账户,第二步让用户选择资料库,第三步让用户选择文件夹,并且用参数mStep来控制和判断当前在第几步。因为目前web-api不支持跨账户copy、move文件,所以当Activity生成时设置账户,用户只能在第二步、第三步之间跳转,若是在第二步用户继续回退,便结束Activity。当用户选择完毕时点击确定按钮,通过监听按钮来触发向服务器传参的操作,听起来这个流程貌似很符合逻辑,但是我果然too naive..原因如下:

毫无疑问,我们新建的Activity是在MainTread这个线程中工作的,当我们向服务器传参时必定要进行HTTP操作,这时我们仍在MainThread线程中。自从Android 3.0以后,安卓便禁止在MainThread中进行HTTP操作。因为一般来讲Http操作比较耗时,放入MainThread线程中容易造成程序假死的现象,挺人性化的改善。

对于这个问题的解决,便是把向服务器传参的操作放入AsyncTask中。AsyncTask简介传送门:http://blog.csdn.net/plussoft/article/details/17035221

eg:

private class CopyAndMoveTask extends AsyncTask<String, Long , Void>

如果在AsyncTask线程中抛出异常,便可用onPostExecute传至MainThread线程,用showTost显示便可

具体的操作详见这个项目的代码(https://code.csdn.net/asv000/seadroid)中CopyActivity.java文件

在最后向服务器传参的操作唯一要注意的就是要向服务器索要更新后的文件List,并且一定要严格判断返回的List是具体哪个文件夹的List(因为当初想当然地对待这个问题导致花了半晚上来调试),对于没有更新List的文件便可调用刷新操作即可。

0 0
原创粉丝点击