当前位置: 移动技术网 > IT编程>移动开发>Android > Android打造属于自己的新闻平台(客户端+服务器)

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

2019年07月24日  | 移动技术网IT编程  | 我要评论

林志颖的老婆是谁,网游之紫风传奇,渔船上的一父三女

完全属于自己的新闻展示平台,展示给大家,希望大家喜欢。

一、新闻的数据库的构建

脚本代码如下:(使用的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>

好啦!具体项目源代码资源如下:

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

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网