Android多线程并发访问网络

最近公司接入了心率设备,把心率传入到服务器,很轻松地完成了这个工作,但是由于没有压力测试的专业人员,测试的任务就落到了我的身上,没办法谁让Android开发人员是个全才呢!!

先说说新的测试要求吧,要同时有不同的多个用户一起访问网络把心率传入到服务器端,那么Android怎么利用多线程来并发的访问网络呢?这个时候我们应该想到多线程的两种方法,继承Thread和实现Runnable接口。这里我用的后一种方法。网络框架用的是我上一篇博客封装的okhttp,不了解的可以看一下简单封装okhttppost方法。

废话不多说,先看看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);

        }

    };

 

}

 

就这样很简单的完成了一个多线程并发请求网络。里边的程序可以根据你自己的 需求改动。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值