Android案例之新闻客户端服务器实现,完全属于自己的新闻展示平台

一、新闻的数据库的构建

脚本代码如下:(使用的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://yunpan.cn/cZcInR3UUH5LV 访问密码 0a8e

项目演示效果:

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

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

时间: 2024-11-05 21:45:34

Android案例之新闻客户端服务器实现,完全属于自己的新闻展示平台的相关文章

出新,新浪新闻客户端“精读”成“现象级”产品

女司机事件再一次让人们重新审视移动新闻平台价值,据不完全统计,事件当天发生在新浪新闻客户端就有近百万的分享和超百万的评论,这个数值,对于一个移动新闻客户端来说,确实惊人.巨大的数字背后,是新浪新闻客户端的"精读"栏目的综合阅读模式推动的结果,新闻在这里不只是一篇文字,而是事件与观点的传递,声像与文字的结合. 据介绍,"精读"是新浪移动首创产品,含文字报道但又不仅限于文字,视频.相关链接等内容俱全,更具特色的是与社交平台(微博)的打通,让新闻在评论中价值飙升.在&qu

开源新闻客户端

该源码是一个开源的新闻客户端项目,让使用者即时了解新闻信息. 下载地址:http://www.devstore.cn/code/info/954.html 运行截图:   

一个基于Android系统的新闻客户端(一)

一.整体概述 在服务器端,通过对凤凰网的抓取存入数据库,客户端通过向服务器发送请求得到新闻. 服务端用WCF,宿主为window服务,客户端为Java写的安卓程序. 二.客户端 我在eclipse里新建了个Android项目,命名为MyNewClient,eclipse自动生成二个xml布局文件,如图: 其中,fragment_main.xml是新版的布局文件,暂时不会用,把它删掉. 新建xml文件,命名为activity_foot.xml,在这里我们要做app的底部,先上代码: <?xml v

开源:我的Android新闻客户端,速度快、体积小、支持离线阅读、操作简便、内容展现形式丰富多样、信息量大、功能全面 等(要代码的留下邮箱)

分享:我的Android新闻客户端,速度快.体积小.支持离线阅读.操作简便.内容展现形式丰富多样.信息量大.功能全面 等(要代码的留下邮箱) 历时30天我为了开发这个新闻客户端APP,以下简称觅闻 http://m.yunxunmi.com/ 由于本人比较愚钝,不太擅长各种开源代码的运用,因此全部从0开始开发,期间开发了: 一个新闻采集器(C++),截止目前为止已经连续运行20多天没出现任何故障,采集接近150个大中型新闻分类网站,采集器下载及介绍网站预计下周免费发布,风格类似我的即时通讯网站 

Android(java)学习笔记205:网易新闻客户端应用编写逻辑过程

1.我们的项目需求是编写一个新闻RSS浏览器,RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,是使用最广泛的XML应用.RSS目前广泛用于网上新闻频道,blog和wiki,主要的版本有0.91, 1.0, 2.0.使用RSS订阅能更快地获取信息,网站提供RSS输出,有利于让用户获取网站内容的最新更新.网络用户可以在客户端借助于支持RSS的聚合工具软件,在不打开网站内容页面的情况下阅读支持RSS输出的网站内容. 例如如下的网易RSS订阅: 2.由于我们这

android开发笔记之网络编程—简易新闻客户端

今天我们来对前面讲过的知识综合运用一下,包括xml的PULL解析,listView的万能适配器等知识.... 那先来看一个组件-->智能图片加载器(smart-image-view),它可以很方便的加载一张网络图片. SmartImageView的设计初衷是来取代Android自带的ImgageView组件,另外它还提供了一些附加功能,如: 支持通过URL来加载图片: 支持从电话簿中加载图片: 异步加载图片: 图片被缓存在内存,以便下次快速加载显示: SmartImageView类可以被很容易扩

android Title滑块动画实现(适合新闻客户端多种栏目的展示)

先上效果图,选择不同的模块,滑动会通过动画形式滑过去,这种适合新闻客户端多种栏目的展示: 这么写Layout: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background

Ace教你一步一步做Android新闻客户端(一)

复制粘贴了那么多博文很不好意思没点自己原创的也说不出去,现在写一篇一步一步教你做安卓新闻客户端,借此机会也是让自己把相关的技术再复习一遍,大神莫笑,专门做给新手看. 手里存了两篇,一个包括软件视图 和新手引导 软件侧滑菜单 滑动主页的GUI篇 一个内容解析篇. 代码里有很详细的注释 所以直接放代码了 有不会的站内信或者评论我会及时回复. MainActivity XML :只有一个ListView布局 <?xml version="1.0" encoding="utf-

【源码分享下载】每日更新之Android应用源码比较不错的新闻客户端

Android应用源码比较不错的新闻客户端 服务分类: 其他 使用服务: 其他 功能分类: 新闻 支持平台: Android 运行环境: Android 开发语言: Java 开发工具: Eclipse 源码大小: 4.11MB 下载地址:http://www.devstore.cn/code/info/95.html 源码简介 本项目是一个挺不错的新闻客户端项目源码,本项目中,启动引导.登录注册.用户中心列表显示.文章分页.下拉刷新.文章收藏.更新反馈等新闻客户端常见的功能都有,项目分层合理,