博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
分享一个Cnblogs简易APP
阅读量:6994 次
发布时间:2019-06-27

本文共 7215 字,大约阅读时间需要 24 分钟。

 最近在学习Android app的开发,俗话说万事开头难,本人也不例外。计算机编程是属于一门要求动手能力和动脑能力都很强的学科,相信很多人都会有这样的经历,看得懂不去用,过不了几天也就忘记了。因而,在学习android开发的时候总想找个项目来实践实践。思来想去也没有找到什么好的点子,索性在此拿cnblogs来开刀。这是一个非常简单的应用,高手请自动飘过;初学者共勉之。

  此次的例子包含了客户端和服务器端,具体情况如下。

  一、开发环境:

  服务器端:采用PHP + Python的方式。

    数据来源:采用scrapy进行抓取的数据,见:。

    Json数据:采用ThinkPhp写的简单页面

  测试环境:小米4

  开发工具:Android Studio、PhpStudy

  compileSdkVersion:23

  二、功能:

    1、最新消息

    2、图片轮播

    3、收藏

    4、查看原文

    5、分享

    目前只有这几个简单的功能,更多功能会在后续的开发中陆续引入。有什么好建议请给我留言吧。

  三、知识点:

    1、Navigation Drawer的用法

2、SharedPreferences
3、SQLite
4、AsyncTask的运用
5、主线程UI更新Handler
6、PullToRefresh的运用
7、Volley库的运用
8、轮播图ViewPager等

  四、怎么可以少得了代码

    1、Handler更新UI主线程,见:

private Handler handlerListView = new Handler(){        @Override        public void handleMessage(Message msg) {            super.handleMessage(msg);            Bundle bundle = (Bundle) msg.obj;            int refreshType = (int) bundle.get("refreshType");            LinkedList
list = (LinkedList
) bundle.get("article"); for (Article article : list){ if (REFRESH_TYPE_UP == refreshType){ listData.add(article); }else if (REFRESH_TYPE_DOWN == refreshType){ listData.add(0, article); } } pullToRefreshView.onRefreshComplete(); adapter.notifyDataSetChanged(); } };

    2、PullToRefresh上拉和下拉刷新,更多内容见:

pullToRefreshView = (PullToRefreshListView) rootView.findViewById(R.id.pull_to_refresh_listview);        pullToRefreshView.setMode(PullToRefreshBase.Mode.BOTH);//两端刷新//        pullToRefreshView.setMode(PullToRefreshBase.Mode.PULL_FROM_START);//上拉刷新//        pullToRefreshView.setMode(PullToRefreshBase.Mode.PULL_FROM_END);//下拉刷新        pullToRefreshView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2
() { @Override public void onPullDownToRefresh(PullToRefreshBase
refreshView) { refreshView.getLoadingLayoutProxy().setRefreshingLabel(getString(R.string.loading)); refreshView.getLoadingLayoutProxy().setPullLabel(getString(R.string.downnloadmore)); refreshView.getLoadingLayoutProxy().setReleaseLabel(getString(R.string.startload));// refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后加载时间:"); if (1 == position) { getArticleList(1, REFRESH_TYPE_DOWN); } else if (2 == position) { new GetDataTask().execute(1, REFRESH_TYPE_DOWN); } } @Override public void onPullUpToRefresh(PullToRefreshBase
refreshView) { refreshView.getLoadingLayoutProxy().setRefreshingLabel(getString(R.string.loading)); refreshView.getLoadingLayoutProxy().setPullLabel(getString(R.string.uploadmore)); refreshView.getLoadingLayoutProxy().setReleaseLabel(getString(R.string.startload));// refreshView.getLoadingLayoutProxy().setLastUpdatedLabel("最后加载时间:"); if (1 == position) { int localPage = (int) (articleDao.getArticleCount(where, whereArgs) / ArticleDao.PAGE_ROW); if (localPage > curPage) { new GetDataTask().execute(curPage + 1, REFRESH_TYPE_UP); } else { getArticleList(curPage + 1, REFRESH_TYPE_UP);//如果本地没有则从服务器中获取 } } else if (2 == position) { new GetDataTask().execute(curPage + 1, REFRESH_TYPE_UP); } } });

  3、Volley获取json格式数据,更多内容见:

final LinkedList
newsArticleList = new LinkedList
(); final RequestQueue requestQueue = Volley.newRequestQueue(getActivity()); String url = Article.ARTICLE_LIST_JSON_URL + "?p=" + page; final JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Request.Method.GET, url, null, new Response.Listener
() { @Override public void onResponse(JSONArray response) { int length = response.length(); try { JSONObject jsonObject; Article article; for (int i = 0; i < length; i++) { jsonObject = response.getJSONObject(i); article = new Article(); article.setTitle(jsonObject.getString("title")); article.setLink(jsonObject.getString("link")); article.setLinkmd5id(jsonObject.getString("linkmd5id")); article.setDesc(jsonObject.getString("desc")); article.setView(jsonObject.getInt("view")); article.setComment(jsonObject.getInt("comment")); article.setDiggnum(jsonObject.getInt("diggnum")); newsArticleList.add(article); } for (Article acl : newsArticleList) { boolean flag = false; for (Article articleLocal : listData) { if (acl.getLinkmd5id().equals(articleLocal.getLinkmd5id())) { flag = true; break; } } if (!flag) { articleDao.addArticleToDb(acl); if (REFRESH_TYPE_DOWN == refreshType) { listData.add(0, acl); } else if (REFRESH_TYPE_UP == refreshType) { listData.add(acl); } } } pullToRefreshView.onRefreshComplete(); //刷新数据 adapter.notifyDataSetChanged(); curPage = page; } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); } }); requestQueue.add(jsonArrayRequest);

  就举这几个例子吧。

  五、代码看完了,说说几点经历吧:

  1、万事开头难。从开始到这个简易App的诞生,首先要面临的是数据如何提供的问题。当然可以用线程的通用系统如ecshop、wordpress等的现成程序,但由于懒得填充文章。采用的是scrapy直接抓取内容入库的方式。因而,首先搞定的事情是数据的获取。

  2、如何获取服务器数据。由于涉及到异步加载的问题,所以采用了google提供的volley;当然你也可以采用AsyncTask结合HttpClient进行获取。然而采用Volley的方式最为简易。  

  3、主UI的设计和刷新加载问题。主UI采用的是Android Studio提供的Navigation Drawer;然而上拉刷新和下拉刷新秉承着不重复造轮子的原则找来了PullToRefresh,然而PullToRefresh的整合(见)由于对Gradle不熟悉,又大费周折。陆续地也就实现了上拉和下拉刷新的功能。

  4、由于涉及到数据存储和收藏的问题,因而采用的Sqlite进行数据的存储和收藏的标记。

  5、然而这只是粗略的一点记录。在开发中,随着功能的引入免不了代码的重构,因而很多代码看起来已经不是最初的样子了。当然,现在的代码仍然需要重构才能显得更为优雅。然而丑媳妇总要见公婆的嘛,后续加入功能再逐步加以优化吧。

  6、应用间歇性崩溃的问题。由于一开始没有采用Handler的方式进行主UI的更新,因而导致主UI间歇性地出现崩溃的现象。更多内容见:

  好了,就先说这么多吧。大家有什么建议呢?请给我留言,谢谢!代码更新在这,https://github.com/jackgitgz/CnblogsApp。共勉之。。。

本文转自秋楓博客园博客,原文链接:http://www.cnblogs.com/rwxwsblog/p/4910805.html,如需转载请自行联系原作者
你可能感兴趣的文章
Supervisor mode access prevention
查看>>
sql语句集合
查看>>
数据可视化之MarkPoint
查看>>
Swift之字符串(String)
查看>>
如何(取消)关闭"windows 2003中ie增强的安全配置"?
查看>>
ORA-12528: TNS:listener: all appropriate instances are blocking new connections
查看>>
AI同传“翻车”,一场尴尬而有效的科普
查看>>
【Unity】手游代码更新策略探讨
查看>>
【Unity】运行时刻资源管理
查看>>
touchSwipe移动端触摸事件
查看>>
XHTML与HTML的区别
查看>>
Redis 集群安装
查看>>
iptables和firewall-cmd实现nat转发配置
查看>>
Oracle 11g中密码过期问题详解
查看>>
PHP常用函数
查看>>
界面 切换
查看>>
linux输入及简单的for循环使用
查看>>
Java自带的性能监测工具之jstat
查看>>
我的友情链接
查看>>
通过rsync清除目录的shell脚本
查看>>