一、建设新闻资料库

例如,下面的脚本代码:(正在使用mysql5.0 数据库)

  1. SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
  2. SET time_zone = "+00:00";
  3. -- Database: `newsdemo`
  4. -- 表的结构 `news`
  5. CREATE TABLE IF NOT EXISTS `news` (
  6. `id` int(10) NOT NULL AUTO_INCREMENT,
  7. `title` text NOT NULL,
  8. `desc` text NOT NULL,
  9. `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  10. `content_url` text NOT NULL,
  11. `pic_url` text NOT NULL,
  12. PRIMARY KEY (`id`)
  13. ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=3 ;
  14. --
  15. -- 转存表中的数据 `news`
  16. --
  17. INSERT INTO `news` (`id`, `title`, `desc`, `time`, `content_url`, `pic_url`) VALUES
  18. (1, 'Oracle解锁封锁的账号', '我们在安装Oracle的时候最后一步有一个管理账户的,里边能够解锁所所需的账户', '2015-03-15 11:50:03', 'http://blog.csdn.net/xlgen157387/article/details/41595709', 'http://img.blog.csdn.net/20141129144613046?
  19. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGxnZW4xNTczODc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center'),
  20. (2, 'Android程序之全国天气预报查询(聚合数据开发)', '项目演示效果例如以下: 项目源码下载地址: 訪问password 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

  1. <?
  2. php
  3. $con = mysql_connect("localhost", "root", "your password!");
  4. //设置字符集为utf8
  5. mysql_query("SET NAMES 'utf8'");
  6. mysql_query("SET CHARACTER SET utf8");
  7. mysql_query("SET CHARACTER_SET_RESULT=utf8");
  8. if (!$con){
  9. die(mysql_error());
  10. }
  11. mysql_select_db("newsdemo", $con);
  12. ?>

详细用于创建json数据的getNewsJSON.php

  1. <?php
  2. /*
  3. * 获得JSON数据
  4. * 返回值:title desc time content_url pic_url
  5. */
  6. require 'mysql_connect.php';
  7. $n = 0;
  8. $result = mysql_query("select * from news");
  9. while ($row = mysql_fetch_array($result)){
  10. $arr[$n++] = array("title" => $row['title'],
  11. "desc" => $row['desc'],
  12. "time" => $row['time'],
  13. "content_url" => $row['content_url'],
  14. "pic_url" => $row['pic_url']
  15. );
  16. }
  17. //数组转换为JSON字符串
  18. echo json_encode($arr);
  19. ?
  20. >

然后訪问地址:http://localhost:8080/NewsDemo/getNewsJSON.php

假设出现下面“乱码”表示成功!

另外给大家一个在线查看json数据的网址:http://json.parser.online.fr/

到此数据库的准备完毕,開始做client!

三、client的实现

项目结构:

MainActivity.java例如以下:

  1. package com.xuliugen.news;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.json.JSONArray;
  5. import org.json.JSONObject;
  6. import android.app.Activity;
  7. import android.content.Intent;
  8. import android.os.Bundle;
  9. import android.os.Handler;
  10. import android.view.View;
  11. import android.widget.AdapterView;
  12. import android.widget.AdapterView.OnItemClickListener;
  13. import android.widget.ListView;
  14. import com.xuliugen.news.adapter.NewsAdapter;
  15. import com.xuliugen.news.model.News;
  16. import com.xuliugen.news.utils.HttpUtils;
  17. public class MainActivity extends Activity implements OnItemClickListener{
  18. private ListView lvNews;
  19. private NewsAdapter adapter;
  20. private List<News> newsList;
  21. //此处须要改动为自己的server地址:也就是详细的server地址:这里不要写你的localhost或者127.0.0.1因为这是要在手机上运行的!
  22. public static final String GET_NEWS_URL = "http://172.23.252.89:8080/NewsDemo/getNewsJSON.php";
  23. @Override
  24. protected void onCreate(Bundle savedInstanceState) {
  25. super.onCreate(savedInstanceState);
  26. setContentView(R.layout.activity_main);
  27. lvNews = (ListView) findViewById(R.id.lvNews); //一条一条的消息展示消息
  28. newsList = new ArrayList<News>(); //初始化
  29. adapter = new NewsAdapter(this, newsList); //也是初始化。会在后期运行getNewsJSON()方法之后更新
  30. lvNews.setAdapter(adapter); //设置构造器
  31. lvNews.setOnItemClickListener(this);
  32. //这里运行了网络的的请求操作
  33. HttpUtils.getNewsJSON(GET_NEWS_URL, getNewsHandler); //传入的一个handler对象
  34. }
  35. // 这里是訪问网络数据的时候。返回的handler
  36. private Handler getNewsHandler = new Handler(){
  37. /**
  38. * 这种方法是Handler自带的方法。用于接受返回的数据
  39. */
  40. public void handleMessage(android.os.Message msg) {
  41. String jsonData = (String) msg.obj;
  42. System.out.println(jsonData);
  43. try {
  44. //下边是解析json
  45. JSONArray jsonArray = new JSONArray(jsonData);
  46. for (int i=0;i<jsonArray.length();i++){
  47. JSONObject object = jsonArray.getJSONObject(i);
  48. String title = object.getString("title");
  49. String desc = object.getString("desc");
  50. String time = object.getString("time");
  51. String content_url = object.getString("content_url");
  52. String pic_url = object.getString("pic_url");
  53. newsList.add(new News(title, desc, time, content_url, pic_url));
  54. }
  55. adapter.notifyDataSetChanged();//通知适配器数据发生变化
  56. } catch (Exception e) {
  57. e.printStackTrace();
  58. }
  59. };
  60. };
  61. /**
  62. * 每个条目的点击事件
  63. */
  64. @Override
  65. public void onItemClick(AdapterView<?> adapter, View view, int position, long arg3) {
  66. //获取被点击的对象
  67. News news = newsList.get(position);
  68. Intent intent = new Intent(this, BrowseNewsActivity.class);
  69. intent.putExtra("content_url", news.getContent_url()); //依据被点击的对象。获取其url
  70. startActivity(intent);
  71. }
  72. }

HttpUtils.java例如以下:

  1. package com.xuliugen.news.utils;
  2. import java.io.BufferedReader;
  3. import java.io.InputStream;
  4. import java.io.InputStreamReader;
  5. import java.net.HttpURLConnection;
  6. import java.net.URL;
  7. import android.graphics.Bitmap;
  8. import android.graphics.BitmapFactory;
  9. import android.os.Handler;
  10. import android.os.Message;
  11. import android.widget.ImageView;
  12. /**
  13. * 訪问网络的工具类
  14. *
  15. * @author xuliugen
  16. *
  17. */
  18. public class HttpUtils {
  19. public static void getNewsJSON(final String url, final Handler handler) {
  20. //要訪问网络,开启一个线程
  21. new Thread(new Runnable() {
  22. @Override
  23. public void run() {
  24. HttpURLConnection conn;
  25. InputStream inputStream;
  26. try {
  27. conn = (HttpURLConnection) new URL(url).openConnection();
  28. conn.setRequestMethod("GET");
  29. inputStream = conn.getInputStream();
  30. BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
  31. String line = "";
  32. StringBuilder result = new StringBuilder(); //StringBuilder初始化不能够null
  33. while ((line = reader.readLine()) != null) {
  34. result.append(line);
  35. }
  36. //使用handler的话要使用Message
  37. Message msg = new Message();
  38. msg.obj = result.toString();
  39. // 通知主线程handler
  40. handler.sendMessage(msg);
  41. } catch (Exception e) {
  42. e.printStackTrace();
  43. }
  44. }
  45. }).start();
  46. }
  47. /**
  48. * 设置图片的信息
  49. *
  50. * 在适配器里边调用
  51. *
  52. * @param ivPic 须要设置的view组件
  53. * @param pic_url 图片的地址
  54. */
  55. public static void setPicBitmap(final ImageView ivPic, final String pic_url) {
  56. new Thread(new Runnable() {
  57. @Override
  58. public void run() {
  59. try {
  60. HttpURLConnection conn = (HttpURLConnection) new URL(pic_url).openConnection();
  61. conn.connect();
  62. InputStream is = conn.getInputStream();
  63. Bitmap bitmap = BitmapFactory.decodeStream(is);
  64. ivPic.setImageBitmap(bitmap);
  65. is.close();
  66. } catch (Exception e) {
  67. e.printStackTrace();
  68. }
  69. }
  70. }).start();
  71. }
  72. }

用于保存json数据的bean–》News.java

  1. package com.xuliugen.news.model;
  2. /**
  3. * 与json数据相相应的bean
  4. *
  5. * @author xuliugen
  6. *
  7. */
  8. public class News {
  9. private String title;
  10. private String desc;
  11. private String time;
  12. private String content_url;
  13. private String pic_url;
  14. /**
  15. * 全參的构造函数
  16. *
  17. * @param title
  18. * @param desc
  19. * @param time
  20. * @param content_url
  21. * @param pic_url
  22. */
  23. public News(String title, String desc, String time, String content_url,
  24. String pic_url) {
  25. setTitle(title);
  26. setDesc(desc);
  27. setTime(time);
  28. setContent_url(content_url);
  29. setPic_url(pic_url);
  30. }
  31. public String getTitle() {
  32. return title;
  33. }
  34. public void setTitle(String title) {
  35. this.title = title;
  36. }
  37. public String getDesc() {
  38. return desc;
  39. }
  40. public void setDesc(String desc) {
  41. this.desc = desc;
  42. }
  43. public String getTime() {
  44. return time;
  45. }
  46. public void setTime(String time) {
  47. this.time = time;
  48. }
  49. public String getContent_url() {
  50. return content_url;
  51. }
  52. public void setContent_url(String content_url) {
  53. this.content_url = content_url;
  54. }
  55. public String getPic_url() {
  56. return pic_url;
  57. }
  58. public void setPic_url(String pic_url) {
  59. this.pic_url = pic_url;
  60. }
  61. }

NewsAdapter.java例如以下:

  1. package com.xuliugen.news.adapter;
  2. import java.util.List;
  3. import android.content.Context;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.widget.BaseAdapter;
  8. import android.widget.ImageView;
  9. import android.widget.TextView;
  10. import com.xuliugen.news.R;
  11. import com.xuliugen.news.model.News;
  12. import com.xuliugen.news.utils.HttpUtils;
  13. /**
  14. * 用于显示在界面上的item
  15. *
  16. * @author piaodangdehun
  17. *
  18. */
  19. public class NewsAdapter extends BaseAdapter {
  20. private Context context;
  21. private List<News> newsList;
  22. /**
  23. * 构造方法的时候传入newsList
  24. *
  25. * @param context
  26. * @param newsList 须要填入的news信息
  27. */
  28. public NewsAdapter(Context context, List<News> newsList) {
  29. this.context = context;
  30. this.newsList = newsList;
  31. }
  32. @Override
  33. public int getCount() {
  34. return newsList.size();
  35. }
  36. @Override
  37. public News getItem(int position) {
  38. return newsList.get(position);
  39. }
  40. @Override
  41. public long getItemId(int position) {
  42. return position;
  43. }
  44. /**
  45. * 为news-item中的布局赋值
  46. */
  47. @Override
  48. public View getView(int position, View convertView, ViewGroup parent) {
  49. if (convertView == null) { //假设为空则又一次创建
  50. convertView = LayoutInflater.from(context).inflate(R.layout.news_item, null);
  51. }
  52. // 获得news-item中的控件
  53. TextView tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
  54. TextView tvDesc = (TextView) convertView.findViewById(R.id.tvDesc);
  55. TextView tvTime = (TextView) convertView.findViewById(R.id.tvTime);
  56. ImageView ivPic = (ImageView) convertView.findViewById(R.id.ivPic);
  57. News news = newsList.get(position);
  58. tvTitle.setText(news.getTitle());
  59. tvDesc.setText(news.getDesc());
  60. tvTime.setText(news.getTime());
  61. String pic_url = news.getPic_url();
  62. HttpUtils.setPicBitmap(ivPic, pic_url);
  63. return convertView;
  64. }
  65. }

详细的布局文件省略。看一下清单文件:

  1. <?xml version="1.0" encoding="utf-8"?
  2. >
  3. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  4. package="com.xuliugen.news"
  5. android:versionCode="1"
  6. android:versionName="1.0" >
  7. <uses-sdk
  8. android:minSdkVersion="8"
  9. android:targetSdkVersion="18" />
  10. <uses-permission android:name="android.permission.INTERNET"/>
  11. <application
  12. android:allowBackup="true"
  13. android:icon="@drawable/ic_launcher"
  14. android:label="@string/app_name"
  15. android:theme="@style/AppTheme" >
  16. <activity
  17. android:name="com.xuliugen.news.MainActivity"
  18. android:label="@string/app_name" >
  19. <intent-filter>
  20. <action android:name="android.intent.action.MAIN" />
  21. <category android:name="android.intent.category.LAUNCHER" />
  22. </intent-filter>
  23. </activity>
  24. <activity android:name="BrowseNewsActivity"></activity>
  25. </application>
  26. </manifest>

好啦!详细项目源码资源例如以下:

http://yunpan.cn/cZcInR3UUH5LV 訪问password 0a8e

项目演示效果:

知识点总结:数据库数据到json数据格式的转换、訪问json数据的方法及解析json的方法、适配器等。

到此结束。喜欢的请默默点赞!

版权声明:本文博主原创文章,博客,未经同意不得转载。

Android新闻案例clientserver达到,完全自己的新闻节目平台的更多相关文章

  1. android json解析及简单例子+Android与服务器端数据交互+Android精彩案例【申明:来源于网络】

    android json解析及简单例子+Android与服务器端数据交互+Android精彩案例[申明:来源于网络] android json解析及简单例子:http://www.open-open. ...

  2. AllJoyn+Android开发案例-android跨设备调用方法

    AllJoyn+Android开发案例-android跨设备调用方法 项目须要涉及AllJoyn开源物联网框架.前面主要了解了一些AllJoyn主要的概念.像总线,总线附件,总线对象,总线接口这种概念 ...

  3. android ListView_新闻案例

    xml设计 <?xml version="1.0"?> -<RelativeLayout tools:context=".MainActivity&qu ...

  4. 类似掌盟的Tab页 Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签 (转)

    原博客地址  :http://blog.csdn.net/xiaanming/article/details/10766053 本文转载,记录学习用,如有需要,请到原作者网站查看(上面这个网址) 之前 ...

  5. Android小案例——简单图片浏览器

    今天上午休息看Android书,里面有个变化图片的示例引起了我的兴趣. 示例需求: 有N张图片,循环显示图片的内容.如果需求让我写我会使用一个变量count来保存显示图片数据的索引,图片显示时做个判断 ...

  6. android 登陆案例_最终版本 sharedpreference

    xml  与之前的登陆案例相同 java代码: package com.itheima.login; import java.util.Map; import com.itheima.login.ut ...

  7. android ANR 案例分析

    案例1:关键词:ContentResolver in AsyncTask onPostExecute, high iowait Process:com.android.email Activity:c ...

  8. Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9971721 大家都知道Android的ActionBar是在3.0以上才有的,那么在3 ...

  9. Android 开发技术选型(博客,新闻,阅读类)

    前言 最开始学习写应用的时候,发现类聚合数据这个平台可以提供一些免费数据接口,于是写了个人的第一个应用-– JuheNews,当时的知识储备稍显粗糙,虽然现在的知识也不咋滴,但是相对之前而言还是有些进 ...

随机推荐

  1. axios采坑之路

    POST请求设置Content-Type 由于后端采用的是form表单形式上送参数,需要设置Content-Type axios设置如下 const _axios = axios.create(con ...

  2. Linux下搭建Memcached缓存系统

    首先说下抱歉,博主近期单位经常加班.博客更新有点慢.希望大家理解,草稿箱里存了不少内容,等不忙时候一点点填坑~ 在一般的站点开发学习时候.都会把数据存放在RDBMS(关系型数据库系统(Relation ...

  3. mac os 虚拟机安装

    https://blog.csdn.net/u011415782/article/details/78505422 感谢

  4. Perl按行分割文件

    Perl按行分割文件 将一个文件按照行数,均等的分割成多个小文件,例如,一个550行的文件,分割为每个文件有100行,则将分割为6个小文件 运行结果 参考代码(split_file.pl) #!/us ...

  5. andorid 自己定义SwitchButton

    因项目缘故需又一次定制SwitchButton,效果例如以下:   步骤例如以下: 1.圆角矩形的绘制 2.字体绘制 3.小圆绘制 4.左右滑动动画效果绘制 代码例如以下: package com.s ...

  6. Java Queue的使用

    Queue的成员函数        add        增加一个元索                     如果队列已满,则抛出一个IIIegaISlabEepeplian异常       rem ...

  7. 【24.34%】【codeforces 560D】Equivalent Strings

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  8. 体验ArcGIS9.2的历史库功能

    转自原文 体验ArcGIS9.2的历史库功能 ESRI公司于2006年11月9日全球同步发布了历史上重要的软件版本ArcGIS9.2,在该版本中,主要新增了以下四大功能(ESRI田昌莲): 第一大新功 ...

  9. git 分支建立及合并

    分支的新建与合并 让我们来看一个简单的分支新建与分支合并的例子,实际工作中你可能会用到类似的工作流. 你将经历如下步骤: 开发某个网站. 为实现某个新的需求,创建一个分支. 在这个分支上开展工作. 正 ...

  10. [CSS] Build Responsive CSS Layouts with Tachyons

    Building responsive css layouts is critical in any modern website. Tachyons makes this easy by desig ...