Android打造属于自己的新闻平台(客户端+服务器)
程序员文章站
2024-03-04 00:02:22
完全属于自己的新闻展示平台,展示给大家,希望大家喜欢。
一、新闻的数据库的构建
脚本代码如下:(使用的mysql5.0 数据库)
set sql_mode =...
完全属于自己的新闻展示平台,展示给大家,希望大家喜欢。
一、新闻的数据库的构建
脚本代码如下:(使用的mysql5.0 数据库)
set sql_mode = "no_auto_value_on_zero"; set time_zone = "+00:00"; -- database: `newsdemo` -- 表的结构 `news` create table if not exists `news` ( `id` int(10) not null auto_increment, `title` text not null, `desc` text not null, `time` timestamp not null default current_timestamp, `content_url` text not null, `pic_url` text not null, primary key (`id`) ) engine=innodb default charset=utf8 auto_increment=3 ; -- -- 转存表中的数据 `news` -- insert into `news` (`id`, `title`, `desc`, `time`, `content_url`, `pic_url`) values (1, 'oracle解锁*的账号', '我们在安装oracle的时候最后一步有一个管理账户的,里边可以解锁所所需的账户', '2015-03-15 11:50:03', 'http://blog.csdn.net/xlgen157387/article/details/41595709', 'http://img.blog.csdn.net/20141129144613046?watermark/2/text/ahr0cdovl2jsb2cuy3nkbi5uzxqvegxnzw4xntczodc=/font/5a6l5l2t/fontsize/400/fill/i0jbqkfcma==/dissolve/70/gravity/center'), (2, 'android程序之全国天气预报查询(聚合数据开发)', '项目演示效果如下: 项目源代码下载地址: 访问密码 2eac二、使用 聚合数据sdk:', '2015-03-15 11:50:13', 'http://blog.csdn.net/xlgen157387/article/details/44246119', 'http://img.blog.csdn.net/20150314095028546');
执行结果如下:(由于这是使用的appserv,所以在phpmyadmin中看到的这种效果1)
二、将数据库中的数据转化为json数据
由于使用的是php语言,所以要安装appserv(这个东西百度一下就知道怎么使用,不在研究!)
(1)在appserv目录下的www目录下创建一个文件夹newsdemo,文件夹中创建两个php文件如下:
连接数据库的文件mysql_connect.php
<?php $con = mysql_connect("localhost", "root", "your password!"); //设置字符集为utf8 mysql_query("set names 'utf8'"); mysql_query("set character set utf8"); mysql_query("set character_set_result=utf8"); if (!$con){ die(mysql_error()); } mysql_select_db("newsdemo", $con); ?>
具体用于创建json数据的getnewsjson.php
<?php /* * 获得json数据 * 返回值:title desc time content_url pic_url */ require 'mysql_connect.php'; $n = 0; $result = mysql_query("select * from news"); while ($row = mysql_fetch_array($result)){ $arr[$n++] = array("title" => $row['title'], "desc" => $row['desc'], "time" => $row['time'], "content_url" => $row['content_url'], "pic_url" => $row['pic_url'] ); } //数组转换为json字符串 echo json_encode($arr); ?>
然后访问地址:http://localhost:8080/newsdemo/getnewsjson.php
如果出现以下“乱码”表示成功!
这里写图片描述
另外给大家一个在线查看json数据的网址:http://json.parser.online.fr/
到此数据库的准备完成,开始做客户端!
三、客户端的实现
mainactivity.java如下:
package com.xuliugen.news; import java.util.arraylist; import java.util.list; import org.json.jsonarray; import org.json.jsonobject; import android.app.activity; import android.content.intent; import android.os.bundle; import android.os.handler; import android.view.view; import android.widget.adapterview; import android.widget.adapterview.onitemclicklistener; import android.widget.listview; import com.xuliugen.news.adapter.newsadapter; import com.xuliugen.news.model.news; import com.xuliugen.news.utils.httputils; public class mainactivity extends activity implements onitemclicklistener{ private listview lvnews; private newsadapter adapter; private list<news> newslist; //此处需要修改为自己的服务器地址:也就是具体的服务器地址:这里不要写你的localhost或者127.0.0.1因为这是要在手机上运行的! public static final string get_news_url = "http://172.23.252.89:8080/newsdemo/getnewsjson.php"; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); lvnews = (listview) findviewbyid(r.id.lvnews); //一条一条的消息展示消息 newslist = new arraylist<news>(); //初始化 adapter = new newsadapter(this, newslist); //也是初始化,会在后期执行getnewsjson()方法之后更新 lvnews.setadapter(adapter); //设置构造器 lvnews.setonitemclicklistener(this); //这里执行了网络的的请求操作 httputils.getnewsjson(get_news_url, getnewshandler); //传入的一个handler对象 } // 这里是访问网络数据的时候,返回的handler private handler getnewshandler = new handler(){ /** * 这个方法是handler自带的方法,用于接受返回的数据 */ public void handlemessage(android.os.message msg) { string jsondata = (string) msg.obj; system.out.println(jsondata); try { //下边是解析json jsonarray jsonarray = new jsonarray(jsondata); for (int i=0;i<jsonarray.length();i++){ jsonobject object = jsonarray.getjsonobject(i); string title = object.getstring("title"); string desc = object.getstring("desc"); string time = object.getstring("time"); string content_url = object.getstring("content_url"); string pic_url = object.getstring("pic_url"); newslist.add(new news(title, desc, time, content_url, pic_url)); } adapter.notifydatasetchanged();//通知适配器数据发生变化 } catch (exception e) { e.printstacktrace(); } }; }; /** * 每一个条目的点击事件 */ @override public void onitemclick(adapterview<?> adapter, view view, int position, long arg3) { //获取被点击的对象 news news = newslist.get(position); intent intent = new intent(this, browsenewsactivity.class); intent.putextra("content_url", news.getcontent_url()); //根据被点击的对象,获取其url startactivity(intent); } }
httputils.java如下:
package com.xuliugen.news.utils; import java.io.bufferedreader; import java.io.inputstream; import java.io.inputstreamreader; import java.net.httpurlconnection; import java.net.url; import android.graphics.bitmap; import android.graphics.bitmapfactory; import android.os.handler; import android.os.message; import android.widget.imageview; /** * 访问网络的工具类 * * @author xuliugen * */ public class httputils { public static void getnewsjson(final string url, final handler handler) { //要访问网络,开启一个线程 new thread(new runnable() { @override public void run() { httpurlconnection conn; inputstream inputstream; try { conn = (httpurlconnection) new url(url).openconnection(); conn.setrequestmethod("get"); inputstream = conn.getinputstream(); bufferedreader reader = new bufferedreader(new inputstreamreader(inputstream)); string line = ""; stringbuilder result = new stringbuilder(); //stringbuilder初始化不可以null while ((line = reader.readline()) != null) { result.append(line); } //使用handler的话要使用message message msg = new message(); msg.obj = result.tostring(); // 通知主线程handler handler.sendmessage(msg); } catch (exception e) { e.printstacktrace(); } } }).start(); } /** * 设置图片的信息 * * 在适配器里边调用 * * @param ivpic 需要设置的view组件 * @param pic_url 图片的地址 */ public static void setpicbitmap(final imageview ivpic, final string pic_url) { new thread(new runnable() { @override public void run() { try { httpurlconnection conn = (httpurlconnection) new url(pic_url).openconnection(); conn.connect(); inputstream is = conn.getinputstream(); bitmap bitmap = bitmapfactory.decodestream(is); ivpic.setimagebitmap(bitmap); is.close(); } catch (exception e) { e.printstacktrace(); } } }).start(); } }
用于保存json数据的bean–》news.java
package com.xuliugen.news.model; /** * 与json数据相对应的bean * * @author xuliugen * */ public class news { private string title; private string desc; private string time; private string content_url; private string pic_url; /** * 全参的构造函数 * * @param title * @param desc * @param time * @param content_url * @param pic_url */ public news(string title, string desc, string time, string content_url, string pic_url) { settitle(title); setdesc(desc); settime(time); setcontent_url(content_url); setpic_url(pic_url); } public string gettitle() { return title; } public void settitle(string title) { this.title = title; } public string getdesc() { return desc; } public void setdesc(string desc) { this.desc = desc; } public string gettime() { return time; } public void settime(string time) { this.time = time; } public string getcontent_url() { return content_url; } public void setcontent_url(string content_url) { this.content_url = content_url; } public string getpic_url() { return pic_url; } public void setpic_url(string pic_url) { this.pic_url = pic_url; } }
newsadapter.java如下:
package com.xuliugen.news.adapter; import java.util.list; import android.content.context; import android.view.layoutinflater; import android.view.view; import android.view.viewgroup; import android.widget.baseadapter; import android.widget.imageview; import android.widget.textview; import com.xuliugen.news.r; import com.xuliugen.news.model.news; import com.xuliugen.news.utils.httputils; /** * 用于显示在界面上的item * * @author piaodangdehun * */ public class newsadapter extends baseadapter { private context context; private list<news> newslist; /** * 构造方法的时候传入newslist * * @param context * @param newslist 需要填入的news信息 */ public newsadapter(context context, list<news> newslist) { this.context = context; this.newslist = newslist; } @override public int getcount() { return newslist.size(); } @override public news getitem(int position) { return newslist.get(position); } @override public long getitemid(int position) { return position; } /** * 为news-item中的布局赋值 */ @override public view getview(int position, view convertview, viewgroup parent) { if (convertview == null) { //如果为空则重新创建 convertview = layoutinflater.from(context).inflate(r.layout.news_item, null); } // 获得news-item中的控件 textview tvtitle = (textview) convertview.findviewbyid(r.id.tvtitle); textview tvdesc = (textview) convertview.findviewbyid(r.id.tvdesc); textview tvtime = (textview) convertview.findviewbyid(r.id.tvtime); imageview ivpic = (imageview) convertview.findviewbyid(r.id.ivpic); news news = newslist.get(position); tvtitle.settext(news.gettitle()); tvdesc.settext(news.getdesc()); tvtime.settext(news.gettime()); string pic_url = news.getpic_url(); httputils.setpicbitmap(ivpic, pic_url); return convertview; } }
具体的布局文件省略,看一下清单文件:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xuliugen.news" android:versioncode="1" android:versionname="1.0" > <uses-sdk android:minsdkversion="8" android:targetsdkversion="18" /> <uses-permission android:name="android.permission.internet"/> <application android:allowbackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/apptheme" > <activity android:name="com.xuliugen.news.mainactivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> <activity android:name="browsenewsactivity"></activity> </application> </manifest>
好啦!具体项目源代码资源如下: http://xiazai.jb51.net/201606/yuanma/androidnews(jb51.net).rar
知识点总结:数据库数据到json数据格式的转换、访问json数据的方法及解析json的方法、适配器等。