智慧农业app手机开发

来源:互联网 发布:js bind方法实现 编辑:程序博客网 时间:2024/04/29 06:27

1.Pull解析:

package com.zknu.xmlpull;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import org.xmlpull.v1.XmlPullParser;import com.zknu.entity.Facility;import android.content.Context;import android.util.Xml;/** * 作用:解析XML文档 *  * */public class XmlPull {/** * 得到父元素 *  *  * */static List<String> parents = null;static String parent = null;public static List<String> getParents(Context context, InputStream is)throws Exception {XmlPullParser parser = Xml.newPullParser();parser.setInput(is, "utf-8");int eventType = parser.getEventType();while (eventType != XmlPullParser.END_DOCUMENT) {switch (eventType) {case XmlPullParser.START_DOCUMENT:parents = new ArrayList<String>();break;case XmlPullParser.START_TAG:String name = parser.getName();if (name.equals("facilityType")) {parent = parser.getAttributeValue(0);}break;case XmlPullParser.TEXT:break;case XmlPullParser.END_TAG:if (parent != null) {parents.add(parent);}parent = null;break;default:break;}eventType = parser.next();}return parents;}/** * 得到子元素 *  *  *  * */public static List<List<Facility>> getChildren(Context context, InputStream is)throws Exception {List<List<Facility>> children = new ArrayList<List<Facility>>();List<Facility> child = null;Facility facility = null;XmlPullParser parser = Xml.newPullParser();parser.setInput(is, "utf-8");int eventType = parser.getEventType();while (eventType != XmlPullParser.END_DOCUMENT) {switch (eventType) {case XmlPullParser.START_DOCUMENT:child = new ArrayList<Facility>();break;case XmlPullParser.START_TAG:String name = parser.getName();if (name.equals("facilityType")) {child = new ArrayList<Facility>();}if (name.equals("facility")) {facility = new Facility();} else if (name.equals("id")) {facility.setId(Integer.parseInt(parser.nextText()));} else if (name.equals("name")) {facility.setName(parser.nextText());} else if (name.equals("state")) {facility.setState(Integer.parseInt(parser.nextText()));}break;case XmlPullParser.TEXT:break;case XmlPullParser.END_TAG:String endname = parser.getName();if (endname.equals("facility")) {child.add(facility);facility = null;}if (endname.equals("facilityType")) {children.add(child);child = null;}break;default:break;}eventType = parser.next();}return children;}}


2.线程类:


package com.zknu.zhihui;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetSocketAddress;import java.net.Socket;import java.net.SocketAddress;import android.annotation.SuppressLint;import android.content.Context;import android.os.Handler;import android.os.Looper;import android.os.Message;@SuppressLint("HandlerLeak")public class ClientThread extends Thread {private OutputStream outputStream = null;private InputStream inputStream = null;private Socket socket;private SocketAddress socketAddress;public static Handler childHandler;private boolean RxFlag = true;private RxThread rxThread;final int TEXT_INFO = 12;static final int RX_EXIT = 11;Context mainContext;Message msg; // Message消息private String strIP; // IP地址private int SERVER_PORT; // 端口public ClientThread(String ip, int port) { // 构造函数 一个参数 设置IP地址strIP = ip;SERVER_PORT = port;}// 连接网络void connect() {RxFlag = true;socketAddress = new InetSocketAddress(strIP, SERVER_PORT);socket = new Socket();try {socket.connect(socketAddress, 3000); // 连接服务器inputStream = socket.getInputStream();outputStream = socket.getOutputStream();msg = FacilityActivity.mainHandler.obtainMessage(1, "连接成功");FacilityActivity.mainHandler.sendMessage(msg);rxThread = new RxThread();rxThread.start();} catch (IOException e) {try {sleep(10);} catch (InterruptedException e1) {e1.printStackTrace();}msg = FacilityActivity.mainHandler.obtainMessage(0, "无法连接到服务器");FacilityActivity.mainHandler.sendMessage(msg);e.printStackTrace();} catch (NumberFormatException e) {}}void initChildHandler() {Looper.prepare(); // 在子线程中创建Handler必须初始化LooperchildHandler = new Handler() {// 子线程消息处理中心public void handleMessage(Message msg) {// 接收主线程及其他线程的消息并处理...switch (msg.what) {case 1:byte[] by=((String) msg.obj).getBytes();int len =by.length;try {outputStream.write(by, 0, len);outputStream.flush();} catch (IOException e) {e.printStackTrace();}break;case RX_EXIT:RxFlag = false;try {if (socket.isConnected()) {inputStream.close();outputStream.close();socket.close();}} catch (IOException e1) {e1.printStackTrace();}childHandler.getLooper().quit();// 结束消息队列break;default:break;}}};// 启动该线程的消息队列Looper.loop();}@Overridepublic void run() {connect();initChildHandler();msg = FacilityActivity.mainHandler.obtainMessage(2, "与服务器断开连接");FacilityActivity.mainHandler.sendMessage(msg);}// socket 接收线程public class RxThread extends Thread {public void run() {try {while (socket.isConnected() && RxFlag) {byte byt[] = new byte[1024 * 1024];int len = inputStream.read(byt);if (len > 0) {// 保存到myxml.xml中File file = new File("/data/data/com.zknu.zhihui","myxml.xml");BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));bos.write(byt, 0, len);bos.flush();bos.close();     msg = FacilityActivity.mainHandler.obtainMessage(3,"保存成功");FacilityActivity.mainHandler.sendMessage(msg);} else if (len < 0) {msg = FacilityActivity.mainHandler.obtainMessage(2,"与服务器断开连接");FacilityActivity.mainHandler.sendMessage(msg);// 退出接收线程msg = childHandler.obtainMessage(RX_EXIT);childHandler.sendMessage(msg);break;}}if (socket.isConnected())socket.close();} catch (IOException e) {e.printStackTrace();}}}}

3.主页面:


package com.zknu.zhihui;import java.io.File;import java.io.FileInputStream;import java.io.InputStream;import java.util.ArrayList;import java.util.List;import com.zknu.utile.Commend;import com.zknu.xmlpull.*;import com.zknu.entity.Facility;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.app.Activity;import android.content.Intent;import android.graphics.Color;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseExpandableListAdapter;import android.widget.Button;import android.widget.ExpandableListView;import android.widget.TextView;import android.widget.Toast;public class FacilityActivity extends Activity {private ExpandableListView eLV;// 定义两个容器private List<String> parents = new ArrayList<String>();private List<List<Facility>> children = new ArrayList<List<Facility>>();public static Handler mainHandler;private String ip;private String port;private Intent intent;private ClientThread clientThread = null;private Message MainMsg;MyAdapter myAdapter = null;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_facility);// 接受传过的ip、portintent = getIntent();ip = intent.getStringExtra("ip");port = intent.getStringExtra("port");clientThread = new ClientThread(ip, Integer.valueOf(port));// 建立客户端线程clientThread.start();/* * eLV = (ExpandableListView) findViewById(R.id.eLV); final MyAdapter * myAdapter = new MyAdapter(); eLV.setAdapter(myAdapter); */// 主线程消息处理中心mainHandler = new Handler() {public void handleMessage(Message msg) {switch (msg.what) {case 1:Toast.makeText(FacilityActivity.this, "网络成功", 1).show();break;case 0:Toast.makeText(FacilityActivity.this, "亲!网络连接失败", 1).show();break;case 3:// 得到保存的xml文件File file = new File("/data/data/com.zknu.zhihui","myxml.xml");// 定义puller解析的流InputStream is = null;InputStream is1 = null;try {is = new FileInputStream(file);is1 = new FileInputStream(file);// Pull解析mxl文档 将解析出来的数据放到parents和children容器了parents = XmlPull.getParents(FacilityActivity.this, is);children = XmlPull.getChildren(FacilityActivity.this,is1);is.close();is1.close();} catch (Exception e) {e.printStackTrace();}//动态刷新适配器myAdapter.notifyDataSetChanged();break;default:break;}}};// ExpandableListView控件绑定适配器eLV = (ExpandableListView) findViewById(R.id.eLV);myAdapter = new MyAdapter();eLV.setAdapter(myAdapter);}// ExpandableListView适配器class MyAdapter extends BaseExpandableListAdapter {@Overridepublic int getGroupCount() {return parents.size();}@Overridepublic int getChildrenCount(int groupPosition) {return children.get(groupPosition).size();}@Overridepublic Object getGroup(int groupPosition) {return parents.size();}@Overridepublic Object getChild(int groupPosition, int childPosition) {return children.get(groupPosition).get(childPosition);}@Overridepublic long getGroupId(int groupPosition) {return groupPosition;}@Overridepublic long getChildId(int groupPosition, int childPosition) {return childPosition;}@Overridepublic boolean hasStableIds() {return false;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {LayoutInflater inflater = LayoutInflater.from(FacilityActivity.this);View view = inflater.inflate(R.layout.parent, null);// 父标题TextView my_text = (TextView) view.findViewById(R.id.textView1);my_text.setText(parents.get(groupPosition));return view;}@Overridepublic View getChildView(final int groupPosition,final int childPosition, boolean isLastChild, View convertView,ViewGroup parent) {LayoutInflater inflater = LayoutInflater.from(FacilityActivity.this);View view = inflater.inflate(R.layout.child, null);// 子标题TextView my_text = (TextView) view.findViewById(R.id.childtextView1);// 得到children容器中Facility实体的name属性设置到my_textmy_text.setText(children.get(groupPosition).get(childPosition).getName());// 定义设备开关的按钮final Button btnON;final Button btnOFF;btnON = (Button) view.findViewById(R.id.buttonON);btnOFF = (Button) view.findViewById(R.id.buttonOFF);// 判断开关按钮的状态if (children.get(groupPosition).get(childPosition).getState() == 1) {btnON.setTextColor(Color.GREEN);btnOFF.setTextColor(Color.RED);} else {btnON.setTextColor(Color.RED);btnOFF.setTextColor(Color.GREEN);}// 定义开关的点击事件 给服务器发命令btnON.setOnClickListener(new View.OnClickListener() {String name;int id;int state;String commend;@Overridepublic void onClick(View v) {name = children.get(groupPosition).get(childPosition).getName();id = children.get(groupPosition).get(childPosition).getId();state = children.get(groupPosition).get(childPosition).getState();// 组合命令commend = Commend.getCommend(name, String.valueOf(id),String.valueOf(state));MainMsg = ClientThread.childHandler.obtainMessage(1,commend);ClientThread.childHandler.sendMessage(MainMsg);}});return view;}@Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {return false;}}}



0 0