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);

        }

    };

 

}

 

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

发布了40 篇原创文章 · 获赞 13 · 访问量 13万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览