最近公司接入了心率设备,把心率传入到服务器,很轻松地完成了这个工作,但是由于没有压力测试的专业人员,测试的任务就落到了我的身上,没办法谁让Android开发人员是个全才呢!!
先说说新的测试要求吧,要同时有不同的多个用户一起访问网络把心率传入到服务器端,那么Android怎么利用多线程来并发的访问网络呢?这个时候我们应该想到多线程的两种方法,继承Thread和实现Runnable接口。这里我用的后一种方法。网络框架用的是我上一篇博客封装的okhttp,不了解的可以看一下简单封装okhttp的post方法。
废话不多说,先看看Custmoer.java。在这个类中主要是我们要做的操作。
package com.example.okhttpdemo;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.example.okhttpdemo.NetWorkUitls.CallBack;
import com.squareup.okhttp.Request;
public class Custmoer implements Runnable{
/**
* 用户 的id
*/
private int userid=1106;
/**
* 心率数据 这里用随机数来代替
*/
private int heartrate=0;
/**
* 构造方法
* @param userid
* @param heartrate
*/
public Custmoer(int userid, int heartrate) {
this.userid = userid;
this.heartrate = heartrate;
}
@Override
public void run() {
sendGet();
}
/**
* 发送网络请求 以下是网络请求部分 根据公司的要求自己修改
*/
private void sendGet() {
//格式化日期
Date nowDate = new Date();
SimpleDateFormat time1 = new SimpleDateFormat("yyyyMMddHHmmss");
String date = time1.format(nowDate);
long time=System.currentTimeMillis()/1000;
String string=userid+""+heartrate+date+time;
System.out.println("userid"+userid);
System.out.println("SignStr="+string);
//TransformDataUtils加密方法
String sign=TransformDataUtils.md5Encoding(string);
//存放参数的集合
Map<String, String> map=new HashMap<String, String>();
map.put("userid", userid+"");
map.put("date", date);
map.put("time", time+"");
map.put("heartrate", heartrate+"");
map.put("sign", sign);
NetWorkUitls.requestNet(url, map, new CallBack() {
/**
* 请求成功
*/
@Override
public void onSuccess(String message) {
System.out.println("请求成功"+message);
}
/**
* 请求失败
*/
@Override
public void onError(Request request, Exception e) {
// TODO Auto-generated method stub
}
});
}
}
下面我们看一下我的MainActivity,其实这个由一个Java程序移植过来的
package com.example.okhttpdemo;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.example.okhttpdemo.NetWorkUitls.CallBack;
import com.squareup.okhttp.Call;
import com.squareup.okhttp.Callback;
import com.squareup.okhttp.FormEncodingBuilder;
import com.squareup.okhttp.OkHttpClient;
import com.squareup.okhttp.Request;
import com.squareup.okhttp.Response;
import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.util.Base64;
import android.view.Menu;
import android.widget.TextView;
public class MainActivity extends Activity {
Map<String,String> map=new HashMap<String, String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//利用handler来发送消息每隔5秒发送一次网络请求
handler.postDelayed(runnable, 5000);
}
/**
* 初始化线程池 并且说明线程池里边的线程数量
*/
ExecutorService service = Executors.newFixedThreadPool(60);
private Handler handler=new Handler();
Runnable runnable=new Runnable() {
@Override
public void run() {
int userid=1106;
for (int i = 0; i < 60; i++) {
userid++;
//利用随机数来模拟心跳在50-200之间
int max=200;
int min=50;
Random random = new Random();
int heartrate = random.nextInt(max)%(max-min+1) + min;
Custmoer custmoer = new Custmoer(userid, heartrate);
service.execute(custmoer);//并发60个用户
}
System.gc();
handler.postDelayed(this, 5000);
}
};
}
就这样很简单的完成了一个多线程并发请求网络。里边的程序可以根据你自己的 需求改动。