欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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)

Android打造属于自己的新闻平台(客户端+服务器)

二、将数据库中的数据转化为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的方法、适配器等。