现在在公司做一手机项目,目前只实现了最基本的功能,有一点不知道怎么办了,就是我现在有一个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.DialogInterface;
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 DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface 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 DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
}
}).create();
dialog.show();
}finally{
configuration.saveFile(this);
}
}}
由于公司用的是linux,写中文注释会出现编码问题,上面的代码的注释是我临时加的,各位见谅啊!
希望各位大家侠看到后帮个尽快啊,这是我在公司做的第一个手机项目,我觉得怎么也要做到让领导满意,希望好心人帮一下啊!先谢过了啊!!!

解决方案 »

  1.   

    requestData 开一个线程thread。这样能提高连接速度。别跟主界面抢了。
      

  2.   

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

  3.   

    requestData()在建个类 让他继承thread 速度可以提升
      

  4.   


    线程已经开了,只是不知道怎么通过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.DialogInterface;
    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 DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface 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 DialogInterface.OnClickListener() {
    @Override
    public void onClick(DialogInterface dialog,
    int which) {
    }
    }).create();
    dialog.show();
    }finally{
    configuration.saveFile(CarInformation.this);
    }
    }

    } }
      

  5.   

    你最好看一下android的handler 线程机制