微型发布系统:Android+FastJSON+PHP

客户端
1、下载来自阿里巴巴提供的FastJSON工具类库。


2、将所下载的jar文件放置在项目的libs目录


3、右键libs目录下的fastjson-1.1.33.jar文件,选择“Build Path=>Add to Build Path”

4、页面布局
代码清单:/FastJSON/res/layout/activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <EditText
        android:id="@+id/nickname"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10"
        android:hint="请输入昵称。。。"
        android:focusable="true"
        android:inputType="textPersonName" />

    <EditText
        android:id="@+id/content"
        android:hint="请输入内容。。。"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >

    </EditText>

    <TableRow
        android:id="@+id/tableRow1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >

        <Button
            android:id="@+id/submit"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="提交" />

        <Button
            android:id="@+id/refresh"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="刷新" />
    </TableRow>

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </ListView>

</LinearLayout>

代码清单:/FastJSON/res/layout/list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/author"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Author"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:textColor="#545FEE" />

    <TextView
        android:id="@+id/weibox"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello World!"
        android:textSize="18dp" />

    <TextView
        android:id="@+id/createTime"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right"
        android:text="2013.10.27" />

</LinearLayout>

5、JSON解析类
代码清单:/FastJSON/src/com/ikras/util/JSONParser.java
public class JSONParser
{
static InputStream is = null;
static JSONObject jObj = null;
static String json = "";

// 构造函数
public JSONParser()
{

}

public JSONObject getJSONFromUrl(String url, List<NameValuePair> params)
{
try
{// 发送Post请求
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(url);
httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
HttpResponse httpResponse = httpClient.execute(httpPost);
HttpEntity httpEntity = httpResponse.getEntity();
is = httpEntity.getContent();
}
catch (Exception e)
{
e.printStackTrace();
}

try
{// 解析返回的数据流
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8"), 8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null)
{
sb.append(line + "\n");
}
is.close();
json = sb.toString();
}
catch (Exception e)
{
Log.e("Buffer Error", "Error converting result " + e.toString());
}

try
{// 尝试解析字符串到JSON对象
// jObj = new JSONObject(json);
jObj = JSON.parseObject(json);// 反序列化为JSONObject对象
}
catch (JSONException e)
{
Log.e("JSON Parser", "Error parsing data " + e.toString());
}

// 返回Json对象
return jObj;
}
}

6、常量类
代码清单:/FastJSON/src/com/ikras/util/C.java
public class C
{
public static String SERVICE_URI = "http://192.168.1.111:80/microbox_server/";
public static String SUCCESS = "success";
public static String TAG = "tag";
public static String MainActivity_TAG = "MainActivity";
public static String TAG_QUERY = "query";
public static String TAG_INSERT = "insert";
public static String TAG_DELETE = "del";
public static String TAG_MODIFY = "modify";
public static String UID = "uid";
public static String WEIBOXES = "weiboxes";
public static String NICKNAME = "nickname";
public static String WEIBOX_TEXT = "text";
}

7、ListView适配器
代码清单:/FastJSON/src/com/ikras/fastjson/ContentAdapter.java
public class ContentAdapter extends BaseAdapter
{
private ArrayList<HashMap<String, String>> jsonList;
private LayoutInflater inflater;

public ContentAdapter(Context context, ArrayList<HashMap<String, String>> jsonList)
{
super();
this.jsonList = jsonList;
this.inflater = LayoutInflater.from(context);// 更简洁
}

@Override
public int getCount()
{
return jsonList.size();
}

@Override
public Object getItem(int arg0)
{
return jsonList.get(arg0);
}

@Override
public long getItemId(int arg0)
{
return arg0;
}

@Override
public View getView(int arg0, View arg1, ViewGroup arg2)
{
ViewHolder holder = null;

if (arg1 == null)
{
holder = new ViewHolder();
arg1 = inflater.inflate(R.layout.list_item, null);
holder.author = (TextView) arg1.findViewById(R.id.author);
holder.weiboxText = (TextView) arg1.findViewById(R.id.weibox);
holder.time = (TextView) arg1.findViewById(R.id.createTime);
arg1.setTag(holder);
}
else
{
holder = (ViewHolder) arg1.getTag();
}
holder.author.setText(jsonList.get(arg0).get("nickname").toString());
holder.weiboxText.setText(jsonList.get(arg0).get("text").toString());
holder.time.setText(jsonList.get(arg0).get("update").toString());
return arg1;
}

static class ViewHolder
{
private TextView author;
private TextView weiboxText;
private TextView time;
}
}

8、功能实现类
代码清单:/FastJSON/src/com/ikras/fastjson/MainActivity.java
public class MainActivity extends Activity implements OnClickListener
{
private Button submitBtn;
private Button refreshBtn;
private ListView contentList;
private EditText weibox;
private EditText nickname;
private ContentAdapter adapter;
private String uidString;
private ArrayList<HashMap<String, String>> jsonList;
private Handler handler = new Handler()
{

@Override
public void handleMessage(Message msg)
{
super.handleMessage(msg);
switch (msg.what)
{
case 0:
if (jsonList != null && jsonList.size() > 0)
{
adapter = new ContentAdapter(getApplicationContext(), jsonList);
contentList.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
Toast.makeText(getApplicationContext(), String.valueOf(msg.obj), Toast.LENGTH_SHORT).show();
break;

case 1:
Toast.makeText(getApplicationContext(), String.valueOf(msg.obj), Toast.LENGTH_SHORT).show();
break;

default:
break;
}
}
};

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
nickname = (EditText) findViewById(R.id.nickname);
weibox = (EditText) findViewById(R.id.content);
submitBtn = (Button) findViewById(R.id.submit);
refreshBtn = (Button) findViewById(R.id.refresh);
contentList = (ListView) findViewById(R.id.listView);
contentList.setOnItemClickListener(new OnItemClickListener()
{// 
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, final int arg2, long arg3)
{
new AlertDialog.Builder(MainActivity.this).setTitle("选择操作").setItems(new String[] { "删除", "编辑" }, new DialogInterface.OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
switch (which)
{
case 0:
uidString = jsonList.get(arg2).get("uid");
Log.e(C.MainActivity_TAG, "点击第" + uidString);
new LoadDataTask().execute(2);
jsonList.remove(arg2);
break;

case 1:
uidString = jsonList.get(arg2).get("uid");
Log.e(C.MainActivity_TAG, "点击第" + uidString);
nickname.setText(jsonList.get(arg2).get("nickname"));
weibox.setText(jsonList.get(arg2).get("text"));
submitBtn.setText("更新");
break;

default:
break;
}
}
}).show();
}
});

// 绑定监听器
submitBtn.setOnClickListener(this);
refreshBtn.setOnClickListener(this);
}

@Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.submit:
if ("更新".equals(submitBtn.getText().toString()))
{
new LoadDataTask().execute(3);
nickname.setText("");
weibox.setText("");
submitBtn.setText("发布");
}
else
{
new LoadDataTask().execute(0);
}
break;

case R.id.refresh:
new LoadDataTask().execute(1);
break;

default:
break;
}
}

class LoadDataTask extends AsyncTask<Integer, String, String>
{
private Message msg;
private ProgressDialog dialog;
private JSONParser jsonParser;
List<NameValuePair> params;
JSONObject json;

@Override
protected void onPreExecute()
{
super.onPreExecute();
dialog = new ProgressDialog(MainActivity.this);
dialog.setMessage("正在加载,请稍后...");
dialog.setIndeterminate(false);
dialog.setCancelable(true);
dialog.show();
}

@Override
protected String doInBackground(Integer... args)
{
switch (args[0])
{
case 0:// 发布消息
String name = String.valueOf(nickname.getText());
String content = String.valueOf(weibox.getText());
jsonParser = new JSONParser();
params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair(C.TAG, C.TAG_INSERT));
params.add(new BasicNameValuePair(C.NICKNAME, name));
params.add(new BasicNameValuePair(C.WEIBOX_TEXT, content));
json = jsonParser.getJSONFromUrl(C.SERVICE_URI, params);

try
{
msg = new Message();
if (json != null && json.getString(C.SUCCESS) != null)
{
String res = json.getString(C.SUCCESS);
if (Integer.parseInt(res) == 1)
{
msg.what = 0;
msg.obj = "成功发布!";
execute(2);
}
else
{
msg.what = 1;
msg.obj = "发布失败,服务器可能除了点问题!";
}
}
else
{
msg.what = 1;
msg.obj = "发布失败,请检查数据连接是否可用!";
}
}
catch (Exception e)
{
// TODO: handle exception
}
finally
{
adapter = new ContentAdapter(getApplicationContext(), jsonList);
dialog.dismiss();
handler.sendMessage(msg);
}
break;

case 1:// 查询
jsonParser = new JSONParser();
params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair(C.TAG, C.TAG_QUERY));
json = jsonParser.getJSONFromUrl(C.SERVICE_URI, params);

try
{
msg = new Message();
if (json != null && json.getString(C.SUCCESS) != null)
{
String res = json.getString(C.SUCCESS);
if (Integer.parseInt(res) == 1)
{
JSONArray weiboxes = json.getJSONArray(C.WEIBOXES);
jsonList = new ArrayList<HashMap<String, String>>();
for (int i = 0; i < weiboxes.size(); i++)
{
JSONObject c = weiboxes.getJSONObject(i);
HashMap<String, String> hashMap = new HashMap<String, String>();
hashMap.put("uid", c.getString("uid"));
hashMap.put("nickname", c.getString("nickname"));
hashMap.put("text", c.getString("text"));
hashMap.put("update", c.getString("update"));
jsonList.add(hashMap);
}
msg.what = 0;
msg.obj = "成功加载!";
}
else
{
msg.what = 1;
msg.obj = "加载失败,服务器可能除了点问题!";
}
}
else
{
msg.what = 1;
msg.obj = "加载失败,请检查数据连接是否可用!";
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
dialog.dismiss();
handler.sendMessage(msg);
}
break;

case 2:// 刪除
jsonParser = new JSONParser();
params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair(C.TAG, C.TAG_DELETE));
params.add(new BasicNameValuePair(C.UID, uidString));// 传参
json = jsonParser.getJSONFromUrl(C.SERVICE_URI, params);
try
{
msg = new Message();
if (json != null && json.getString(C.SUCCESS) != null)
{
String res = json.getString(C.SUCCESS);
if (Integer.parseInt(res) == 1)
{
msg.what = 0;
msg.obj = "成功刪除!";
}
else
{
msg.what = 1;
msg.obj = "删除失败!";
}
}
else
{
msg.what = 1;
msg.obj = "删除失败,请检查数据连接是否可用!";
}
}
catch (Exception e)
{
// TODO: handle exception
}
finally
{
dialog.dismiss();
handler.sendMessage(msg);
}
break;

case 3:// 更新
jsonParser = new JSONParser();
params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair(C.TAG, C.TAG_MODIFY));
params.add(new BasicNameValuePair(C.UID, uidString));// 传参
params.add(new BasicNameValuePair(C.NICKNAME, String.valueOf(nickname.getText())));// 传参
params.add(new BasicNameValuePair(C.WEIBOX_TEXT, String.valueOf(weibox.getText())));// 传参
json = jsonParser.getJSONFromUrl(C.SERVICE_URI, params);
try
{
msg = new Message();
if (json != null && json.getString(C.SUCCESS) != null)
{
String res = json.getString(C.SUCCESS);
if (Integer.parseInt(res) == 1)
{
msg.what = 0;
msg.obj = "更新成功!";
}
else
{
msg.what = 1;
msg.obj = "更新失败!";
}
}
else
{
msg.what = 1;
msg.obj = "更新失败,请检查数据连接是否可用!";
}
}
catch (Exception e)
{
// TODO: handle exception
}
finally
{
dialog.dismiss();
handler.sendMessage(msg);
}
break;

default:
break;
}
return null;
}

@Override
protected void onPostExecute(String result)
{
super.onPostExecute(result);
dialog.dismiss();
}
}
}

9、添加网络权限
代码清单:/FastJSON/AndroidManifest.xml
    <uses-permission android:name="android.permission.INTERNET" />

服务端
1、数据库配置常量
代码清单:/microbox_server/include/config.php
<?php
define("DB_HOST", "localhost:3306");
define("DB_USER", "root");
define("DB_PASSWORD", "");
define("DB_DATABASE", "microbox");
?>

2、数据库连接类
代码清单:/microbox_server/include/DB_Connect.php
<?php
class DB_Connect {

/**构造函数*/
function __construct() {
}

/**析构函数*/
function __destruct() {
// $this->close();
}

/**连接数据库*/
public function connect() {
require_once 'include/config.php';
// 连接mysql数据库
$con = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD)or die(mysql_error());
// 设置校对字符集
mysql_query("SET NAMES utf8") or die(mysql_error());
// 选择数据库
mysql_select_db(DB_DATABASE) or die(mysql_error()) or die(mysql_error());

// 返回数据库操作对象
return $con;
}

// 关闭数据库连接
public function close() {
mysql_close();
}
}
?>

3、数据库操作类
代码清单:/microbox_server/include/DB_Functions.php
<?php
class DB_Functions {
private $db;
function __construct() {
require_once 'DB_Connect.php';
// 数据库连接
$this->db = new DB_Connect();
$this->db->connect();
}

/**插入数据*/
public function insert($nickname, $text) {
$uuid = md5(time() . mt_rand(1,1000000));// md5随机值
$result = mysql_query("INSERT INTO `all`(`uid`, `unique_id`, `nickname`, `text`, `update`) VALUES (NULL, '$uuid', '$nickname', '$text', NOW())") or die(mysql_error());
// 检查是否成功存储
if ($result) {
$uid = mysql_insert_id(); // 最后插入的ID号
$result = mysql_query("SELECT * FROM `all` WHERE `uid` = '$uid'")or die(mysql_error());
return mysql_fetch_array($result);
} else {
return false;
}
}

/**查询数据*/
public function query() {
$response["weiboxArray"] = array();
$result = mysql_query("SELECT * FROM `all` order by `uid` desc limit 0,10") or die(mysql_error());
if (mysql_num_rows($result) > 0) {
while ($row = mysql_fetch_array($result)) {
$weiboxArray = array();
$weiboxArray["uid"] = $row["uid"];
$weiboxArray["unique_id"] = $row["unique_id"];
$weiboxArray["nickname"] = $row["nickname"];
$weiboxArray["text"] = $row["text"];
$weiboxArray["update"] = $row["update"];
array_push($response["weiboxArray"], $weiboxArray);
}
return $response;
} else {
return false;
}
}

/**修改数据*/
public function modify($uid, $nickname, $content) {
$result = mysql_query("UPDATE `all` SET `nickname` = '$nickname', `text` = '$content', `update` = NOW() WHERE `uid` = $uid") or die(mysql_error());
if ($result) {
return true;
}else {
return false;
}
}

/**删除数据*/
public function delete($uid) {
$result = mysql_query("DELETE FROM `all` WHERE `uid` = '$uid'")or die(mysql_error());
if (mysql_affected_rows()>0) {
return true;
}else {
return false;
}
}
}
?>

4、业务流转控制
代码清单:/microbox_server/index.php
<?php
if (isset($_POST['tag'])&&!empty($_POST['tag'])) {
$tag = $_POST['tag'];
require_once 'include/DB_Functions.php';
$db = new DB_Functions();
// 响应数组
$response = array("tag" => $tag, "success" => 0);

if ($tag == 'query') {
$query = $db->query();
if ($query != false) {
$response["weiboxes"] = array();
$response["success"] = 1;
foreach($query as $key=>$value){
foreach($value as $value2){
array_push($response["weiboxes"], $value2);
}
}
}else {
$response["success"] = 0;
}
// 中文支持
echo preg_replace("#\\\u([0-9a-f]{4})#ie", "iconv('UCS-2BE', 'UTF-8', pack('H4', '\\1'))", json_encode($response));
return;
}elseif ($tag == 'insert') {
$nickname = $_POST['nickname'];
$text = $_POST['text'];
$insert = $db->insert($nickname, $text);
if ($insert != false) {
$response["success"] = 1;
}else {
$response["success"] = 0;
}
echo json_encode($response);
return;
}elseif ($tag == 'modify') {
$uid = $_POST['uid'];
$nickname = $_POST['nickname'];
$text = $_POST['text'];
$modify = $db->modify($uid, $nickname, $text);
if ($modify != false) {
$response["success"] = 1;
}else {
$response["success"] = 0;
}
echo json_encode($response);
return;
}elseif ($tag == 'del') {
$uid = $_POST['uid'];
$db->delete($uid);
if ($db) {
$response["success"]=1;
}else {
$response["success"]=0;
}
echo json_encode($response);
}
}else {
echo 'Access failed!';
}
?>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值