当前位置:编程学习 > wap >>

各位帮个忙啊,看看这代码怎么修改啊!!!

现在在公司做一手机项目,目前只实现了最基本的功能,有一点不知道怎么办了,就是我现在有一个Activity的内容是从Socket通信中取得的数据,然后显示出来,现在就是第一次进入这个Activity时连接Socket服务端时会花费很长时间,不知道怎么优化呢,还有就是现在我写的这个是只从Socket中获取一次数据的,后面的肯定会做成监听模式的,就是Socket中有数据发过来就及时更新数据并在Activity中显示出来,不多说了,下面是代码:

package com.zyyu;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.DialogInte易做图ce;
import android.os.Bundle;
import android.widget.SimpleAdapter;

public class CarInformation extends ListActivity {
private String carInfo = new String();
private static String ipAddress = new String();
private static String port = new String();
Map<String, String> car_info = new HashMap<String, String>();

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestData();//请求数据
SimpleAdapter adapter = new SimpleAdapter(this, showData(),
R.layout.list, new String[] { "img", "info", "imgtitle" },
new int[] { R.id.img, R.id.car_val, R.id.titleImg });
setListAdapter(adapter);

}
/**
 * 方法的作用是将数据放到一个list当中,而每个数据就是一个map
 * @return
 */
private List<Map<String, Object>> showData() {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

Map<String, Object> map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg1);
map.put("info", car_info.get("car_speed"));
map.put("imgtitle", R.drawable.carinfo1);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg2);
map.put("info", car_info.get("car_engine"));
map.put("imgtitle", R.drawable.carinfo2);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg3);
map.put("info", car_info.get("car_codetee"));
map.put("imgtitle", R.drawable.carinfo3);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg4);
map.put("info", car_info.get("car_enttee"));
map.put("imgtitle", R.drawable.carinfo4);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg5);
map.put("info", car_info.get("car_goalspeed"));
map.put("imgtitle", R.drawable.carinfo5);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg6);
map.put("info", car_info.get("car_airdoor"));
map.put("imgtitle", R.drawable.carinfo6);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg7);
map.put("info", car_info.get("car_etime"));
map.put("imgtitle", R.drawable.carinfo7);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg8);
map.put("info", car_info.get("car_stream"));
map.put("imgtitle", R.drawable.carinfo8);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg9);
map.put("info", car_info.get("car_runroad"));
map.put("imgtitle", R.drawable.carinfo9);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg10);
map.put("info", car_info.get("car_runtime"));
map.put("imgtitle", R.drawable.carinfo10);
list.add(map);
return list;
}
/**
 * 方法的作用是解析socket中发过来的字符串
 * @param strInfo
 */
private void getInfo(String strInfo) {
System.out.println("进入了获取数据的函数!");
int i = 0, n = 0, m = 1;
String myStr;
myStr = strInfo;
String[] myInfo = new String[12];
for (i = 1; i < myStr.length(); i++) {
if (myStr.charAt(i) == ':') {
myInfo[n] = myStr.substring(m, i);
m = i + 1;
n++;
}
}
for (i = 0; i < n; i++) {

String count = myInfo[i].substring(5);
if (myInfo[i].substring(0, 4).equals("1001")) {
car_info.put("car_engine", count);
}
if (myInfo[i].substring(0, 4).equals("1002")) {
car_info.put("car_speed", count);
}
if (myInfo[i].substring(0, 4).equals("1003")) {
car_info.put("car_codetee", count);
}
if (myInfo[i].substring(0, 4).equals("1004")) {
car_info.put("car_goalspeed", count);
}

if (myInfo[i].substring(0, 4).equals("1005")) {
car_info.put("car_engine", count);
}
if (myInfo[i].substring(0, 4).equals("1006")) {
car_info.put("car_enttee", count);
}

if (myInfo[i].substring(0, 4).equals("1007")) {
car_info.put("car_airdoor", count);
}
if (myInfo[i].substring(0, 4).equals("1008")) {
car_info.put("car_etime", count);
}

if (myInfo[i].substring(0, 4).equals("1009")) {
car_info.put("car_stream", count);
}
if (myInfo[i].substring(0, 4).equals("1010")) {
car_info.put("car_runroad", count);
}
if (myInfo[i].substring(0, 4).equals("1011")) {
car_info.put("car_runtime", count);
}
}

}
/**
 * 方法的作用是和服务端建立通信并发送请求和接收数据
 */
private void requestData(){
// 创建一个Socket对象,指定服务器端的IP地址和端口号
Configuration configuration = new Configuration(CarInformation.this);
ipAddress = configuration.getValue("ip");
port = configuration.getValue("port");
System.out.println("ipaddress:" + ipAddress + " port:" + port);
try {
Socket socket = new Socket(ipAddress, Integer.valueOf(port));
// 从Socket当中得到OutputStream
OutputStream outputStream = socket.getOutputStream();
outputStream.write(new String("getinfo").getBytes());
InputStream inputstream = socket.getInputStream();
BufferedReader streamReader = new BufferedReader(
new InputStreamReader(inputstream));
while ((carInfo = streamReader.readLine()) != null) {
System.out.println(carInfo);
if(carInfo.substring(0, 8).equals("TA CA 10")){
getInfo(carInfo);
}
}
inputstream.read();
} catch (UnknownHostException e) {
e.printStackTrace();
Dialog dialog = new AlertDialog.Builder(CarInformation.this)
.setTitle(R.string.prompt).setMessage(
"获取车辆信息错误,原因是连接到车机端时失败,请确认手机和车机都连接了网络并且车机是开机状态")
.setPositiveButton(R.string.ok,
new DialogInte易做图ce.OnClickListener() {
@Override
public void onClick(DialogInte易做图ce dialog,
int which) {
}
}).create();
dialog.show();
} catch (IOException e) {
e.printStackTrace();
Dialog dialog = new AlertDialog.Builder(CarInformation.this)
.setTitle(R.string.prompt).setMessage(
"获取车辆信息错误,原因是连接到车机端时失败,请确认手机和车机都连接了网络并且车机是开机状态")
.setPositiveButton(R.string.ok,
new DialogInte易做图ce.OnClickListener() {
@Override
public void onClick(DialogInte易做图ce dialog,
int which) {
}
}).create();
dialog.show();
}finally{
configuration.saveFile(this);
}
}

}




由于公司用的是linux,写中文注释会出现编码问题,上面的代码的注释是我临时加的,各位见谅啊!
希望各位大家侠看到后帮个尽快啊,这是我在公司做的第一个手机项目,我觉得怎么也要做到让领导满意,希望好心人帮一下啊!先谢过了啊!!! --------------------编程问答-------------------- requestData 开一个线程thread。这样能提高连接速度。别跟主界面抢了。 --------------------编程问答-------------------- 你确定多线程可以? --------------------编程问答-------------------- mark 表示关注 --------------------编程问答-------------------- 重新开个线程呗。你这些方法起码可以多开2个线程了。 --------------------编程问答-------------------- Android不要阻塞UI线程,自己再启动一个线程(如果嫌麻烦可以直接继承系统自带的异步任务)或服务来请求数据,之后通过Handler来捕获消息 更新UI --------------------编程问答-------------------- requestData()在建个类 让他继承thread 速度可以提升 --------------------编程问答--------------------
引用 5 楼 beijingextjs 的回复:
Android不要阻塞UI线程,自己再启动一个线程(如果嫌麻烦可以直接继承系统自带的异步任务)或服务来请求数据,之后通过Handler来捕获消息 更新UI


线程已经开了,只是不知道怎么通过Handler来捕获消息 更新UI,代码已经修改成了如下:

package com.zyyu;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.DialogInte易做图ce;
import android.os.Bundle;
import android.widget.SimpleAdapter;

public class CarInformation extends ListActivity {
private String carInfo = new String();
private static String ipAddress = new String();
private static String port = new String();
Map<String, String> car_info = new HashMap<String, String>();

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new requestData().start();//请求数据
SimpleAdapter adapter = new SimpleAdapter(this, showData(),
R.layout.list, new String[] { "img", "info", "imgtitle" },
new int[] { R.id.img, R.id.car_val, R.id.titleImg });
setListAdapter(adapter);

}
/**
 * 方法的作用是将数据放到一个list当中,而每个数据就是一个map
 * @return
 */
private List<Map<String, Object>> showData() {
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();

Map<String, Object> map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg1);
map.put("info", car_info.get("car_speed"));
map.put("imgtitle", R.drawable.carinfo1);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg2);
map.put("info", car_info.get("car_engine"));
map.put("imgtitle", R.drawable.carinfo2);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg3);
map.put("info", car_info.get("car_codetee"));
map.put("imgtitle", R.drawable.carinfo3);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg4);
map.put("info", car_info.get("car_enttee"));
map.put("imgtitle", R.drawable.carinfo4);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg5);
map.put("info", car_info.get("car_goalspeed"));
map.put("imgtitle", R.drawable.carinfo5);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg6);
map.put("info", car_info.get("car_airdoor"));
map.put("imgtitle", R.drawable.carinfo6);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg7);
map.put("info", car_info.get("car_etime"));
map.put("imgtitle", R.drawable.carinfo7);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg8);
map.put("info", car_info.get("car_stream"));
map.put("imgtitle", R.drawable.carinfo8);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg9);
map.put("info", car_info.get("car_runroad"));
map.put("imgtitle", R.drawable.carinfo9);
list.add(map);

map = new HashMap<String, Object>();
map.put("img", R.drawable.carimg10);
map.put("info", car_info.get("car_runtime"));
map.put("imgtitle", R.drawable.carinfo10);
list.add(map);
return list;
}
/**
 * 方法的作用是解析socket中发过来的字符串
 * @param strInfo
 */
private void getInfo(String strInfo) {
System.out.println("进入了获取数据的函数!");
int i = 0, n = 0, m = 1;
String myStr;
myStr = strInfo;
String[] myInfo = new String[12];
for (i = 1; i < myStr.length(); i++) {
if (myStr.charAt(i) == ':') {
myInfo[n] = myStr.substring(m, i);
m = i + 1;
n++;
}
}
for (i = 0; i < n; i++) {

String count = myInfo[i].substring(5);
if (myInfo[i].substring(0, 4).equals("1001")) {
car_info.put("car_engine", count);
}
if (myInfo[i].substring(0, 4).equals("1002")) {
car_info.put("car_speed", count);
}
if (myInfo[i].substring(0, 4).equals("1003")) {
car_info.put("car_codetee", count);
}
if (myInfo[i].substring(0, 4).equals("1004")) {
car_info.put("car_goalspeed", count);
}

if (myInfo[i].substring(0, 4).equals("1005")) {
car_info.put("car_engine", count);
}
if (myInfo[i].substring(0, 4).equals("1006")) {
car_info.put("car_enttee", count);
}

if (myInfo[i].substring(0, 4).equals("1007")) {
car_info.put("car_airdoor", count);
}
if (myInfo[i].substring(0, 4).equals("1008")) {
car_info.put("car_etime", count);
}

if (myInfo[i].substring(0, 4).equals("1009")) {
car_info.put("car_stream", count);
}
if (myInfo[i].substring(0, 4).equals("1010")) {
car_info.put("car_runroad", count);
}
if (myInfo[i].substring(0, 4).equals("1011")) {
car_info.put("car_runtime", count);
}
}

}
/**
 * 方法的作用是开一个线程和服务端建立通信并发送请求和接收数据
 */
class requestData extends Thread{

@Override
public void run() {
// 创建一个Socket对象,指定服务器端的IP地址和端口号
Configuration configuration = new Configuration(CarInformation.this);
ipAddress = configuration.getValue("ip");
port = configuration.getValue("port");
System.out.println("ipaddress:" + ipAddress + " port:" + port);
try {
Socket socket = new Socket(ipAddress, Integer.valueOf(port));
// 从Socket当中得到OutputStream
OutputStream outputStream = socket.getOutputStream();
outputStream.write(new String("getinfo").getBytes());
InputStream inputstream = socket.getInputStream();
BufferedReader streamReader = new BufferedReader(
new InputStreamReader(inputstream));
while ((carInfo = streamReader.readLine()) != null) {
System.out.println(carInfo);
if(carInfo.substring(0, 8).equals("TA CA 10")){
getInfo(carInfo);
}
}
inputstream.read();
} catch (UnknownHostException e) {
e.printStackTrace();
Dialog dialog = new AlertDialog.Builder(CarInformation.this)
.setTitle(R.string.prompt).setMessage(
"获取车辆信息错误,原因是连接到车机端时失败,请确认手机和车机都连接了网络并且车机是开机状态")
.setPositiveButton(R.string.ok,
new DialogInte易做图ce.OnClickListener() {
@Override
public void onClick(DialogInte易做图ce dialog,
int which) {
}
}).create();
dialog.show();
} catch (IOException e) {
e.printStackTrace();
Dialog dialog = new AlertDialog.Builder(CarInformation.this)
.setTitle(R.string.prompt).setMessage(
"获取车辆信息错误,原因是连接到车机端时失败,请确认手机和车机都连接了网络并且车机是开机状态")
.setPositiveButton(R.string.ok,
new DialogInte易做图ce.OnClickListener() {
@Override
public void onClick(DialogInte易做图ce dialog,
int which) {
}
}).create();
dialog.show();
}finally{
configuration.saveFile(CarInformation.this);
}
}

}

}

--------------------编程问答--------------------
引用 7 楼 kangyawei1990 的回复:
引用 5 楼 beijingextjs 的回复:

Android不要阻塞UI线程,自己再启动一个线程(如果嫌麻烦可以直接继承系统自带的异步任务)或服务来请求数据,之后通过Handler来捕获消息 更新UI


线程已经开了,只是不知道怎么通过Handler来捕获消息 更新UI,代码已经修改成了如下:

Java code


package com.zyyu;

impo……
你最好看一下android的handler 线程机制
补充:移动开发 ,  Android
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,