Android新闻案例clientserver达到,完全自己的新闻节目平台
一、建設(shè)新聞資料庫
例如,下面的腳本代碼:(正在使用mysql5.0 數(shù)據(jù)庫)
SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; SET time_zone = "+00:00";-- Database: `newsdemo` -- 表的結(jié)構(gòu) `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 ;-- -- 轉(zhuǎn)存表中的數(shù)據(jù) `news` --INSERT INTO `news` (`id`, `title`, `desc`, `time`, `content_url`, `pic_url`) VALUES (1, 'Oracle解鎖封鎖的賬號', '我們在安裝Oracle的時(shí)候最后一步有一個(gè)管理賬戶的,里邊能夠解鎖所所需的賬戶', '2015-03-15 11:50:03', 'http://blog.csdn.net/xlgen157387/article/details/41595709', 'https://img-blog.csdn.net/20141129144613046?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGxnZW4xNTczODc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center'
), (2, 'Android程序之全國天氣預(yù)報(bào)查詢(聚合數(shù)據(jù)開發(fā))', '項(xiàng)目演示效果例如以下: 項(xiàng)目源碼下載地址: 訪問password 2eac二、使用 聚合數(shù)據(jù)SDK:', '2015-03-15 11:50:13', 'http://blog.csdn.net/xlgen157387/article/details/44246119', 'https://img-blog.csdn.net/20150314095028546');運(yùn)行結(jié)果例如以下:(因?yàn)檫@是使用的appserv。所以在phpMyAdmin中看到的這樣的效果1)
二、將數(shù)據(jù)庫中的數(shù)據(jù)轉(zhuǎn)化為json數(shù)據(jù)
因?yàn)槭褂玫氖莗hp語言,所以要安裝appserv(這個(gè)東西百度一下就知道怎么使用。不在研究。)
(1)在appserv文件夾下的www文件夾下創(chuàng)建一個(gè)文件夾NewsDemo。文件夾中創(chuàng)建兩個(gè)php文件例如以下:
連接數(shù)據(jù)庫的文件mysql_connect.php
<?php
$con = mysql_connect("localhost", "root", "your password!"); //設(shè)置字符集為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); ?>詳細(xì)用于創(chuàng)建json數(shù)據(jù)的getNewsJSON.php
<?php/** 獲得JSON數(shù)據(jù)* 返回值: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']);}//數(shù)組轉(zhuǎn)換為JSON字符串echo json_encode($arr);?>
然后訪問地址:http://localhost:8080/NewsDemo/getNewsJSON.php
假設(shè)出現(xiàn)下面“亂碼”表示成功!
另外給大家一個(gè)在線查看json數(shù)據(jù)的網(wǎng)址:http://json.parser.online.fr/
到此數(shù)據(jù)庫的準(zhǔn)備完畢,開始做client!
三、client的實(shí)現(xiàn)
項(xiàng)目結(jié)構(gòu):
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;//此處須要改動(dòng)為自己的server地址:也就是詳細(xì)的server地址:這里不要寫你的localhost或者127.0.0.1因?yàn)檫@是要在手機(jī)上運(yùn)行的!public static final String GET_NEWS_URL = "http://172.23.252.89:8080/NewsDemo/getNewsJSON.php";@Overrideprotected 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); //也是初始化。會(huì)在后期運(yùn)行g(shù)etNewsJSON()方法之后更新lvNews.setAdapter(adapter); //設(shè)置構(gòu)造器lvNews.setOnItemClickListener(this);//這里運(yùn)行了網(wǎng)絡(luò)的的請求操作HttpUtils.getNewsJSON(GET_NEWS_URL, getNewsHandler); //傳入的一個(gè)handler對象}// 這里是訪問網(wǎng)絡(luò)數(shù)據(jù)的時(shí)候。返回的handlerprivate Handler getNewsHandler = new Handler(){/*** 這種方法是Handler自帶的方法。用于接受返回的數(shù)據(jù)*/public void handleMessage(android.os.Message msg) {String jsonData = (String) msg.obj;System.out.println(jsonData);try {//下邊是解析jsonJSONArray 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();//通知適配器數(shù)據(jù)發(fā)生變化} catch (Exception e) {e.printStackTrace();}};};/*** 每個(gè)條目的點(diǎn)擊事件*/@Overridepublic void onItemClick(AdapterView<?> adapter, View view, int position, long arg3) {//獲取被點(diǎn)擊的對象News news = newsList.get(position); Intent intent = new Intent(this, BrowseNewsActivity.class);intent.putExtra("content_url", news.getContent_url()); //依據(jù)被點(diǎn)擊的對象。獲取其urlstartActivity(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;/*** 訪問網(wǎng)絡(luò)的工具類* * @author xuliugen* */ public class HttpUtils {public static void getNewsJSON(final String url, final Handler handler) {//要訪問網(wǎng)絡(luò),開啟一個(gè)線程new Thread(new Runnable() {@Overridepublic 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初始化不能夠nullwhile ((line = reader.readLine()) != null) {result.append(line);}//使用handler的話要使用MessageMessage msg = new Message();msg.obj = result.toString();// 通知主線程handlerhandler.sendMessage(msg);} catch (Exception e) {e.printStackTrace();}}}).start();}/*** 設(shè)置圖片的信息* * 在適配器里邊調(diào)用* * @param ivPic 須要設(shè)置的view組件* @param pic_url 圖片的地址*/public static void setPicBitmap(final ImageView ivPic, final String pic_url) {new Thread(new Runnable() {@Overridepublic 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數(shù)據(jù)的bean–》News.java
package com.xuliugen.news.model;/*** 與json數(shù)據(jù)相相應(yīng)的bean* * @author xuliugen* */ public class News {private String title;private String desc;private String time;private String content_url;private String pic_url;/*** 全參的構(gòu)造函數(shù)* * @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;/*** 構(gòu)造方法的時(shí)候傳入newsList* * @param context* @param newsList 須要填入的news信息*/public NewsAdapter(Context context, List<News> newsList) {this.context = context;this.newsList = newsList;}@Overridepublic int getCount() {return newsList.size();}@Overridepublic News getItem(int position) {return newsList.get(position);}@Overridepublic long getItemId(int position) {return position;}/*** 為news-item中的布局賦值*/@Overridepublic View getView(int position, View convertView, ViewGroup parent) {if (convertView == null) { //假設(shè)為空則又一次創(chuàng)建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;}}詳細(xì)的布局文件省略。看一下清單文件:
<?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>好啦!詳細(xì)項(xiàng)目源碼資源例如以下:
http://yunpan.cn/cZcInR3UUH5LV 訪問password 0a8e
項(xiàng)目演示效果:
知識點(diǎn)總結(jié):數(shù)據(jù)庫數(shù)據(jù)到j(luò)son數(shù)據(jù)格式的轉(zhuǎn)換、訪問json數(shù)據(jù)的方法及解析json的方法、適配器等。
到此結(jié)束。喜歡的請默默點(diǎn)贊!
版權(quán)聲明:本文博主原創(chuàng)文章,博客,未經(jīng)同意不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的Android新闻案例clientserver达到,完全自己的新闻节目平台的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenDDS
- 下一篇: ios学习笔记block回调的应用(一个