比如我要发送一个请求,给httpserver,然后server,返回给我信息,是需要时间的,这个过程,
我们的ui界面不能,被阻塞要不然卡顿,这个时候我的做法是,只要有消息来了,我就把消息
放到,我自定义的LinkedQueue队列中去,然后发送一个消息,给handler,然后handler中,就去
判断队列如果不是空,就去从队列中取出来一条就去处理.
1.下面这个是自定义的消息队列.
package com.baidu.idl.face.main.utils;
import java.util.LinkedList;
public class LinkedQueue
{
private LinkedList list = new LinkedList();
public void clear()//销毁队列
{
list.clear();
}
public boolean isQueueEmpty()//判断队列是否为空
{
return list.isEmpty();
}
public void enQueue(Object o)//进队
{
list.addLast(o);
}
public Object deQueue()//出队
{
if(!list.isEmpty())
{
return list.removeFirst();
}
return "队列为空";
}
public int QueueLength()//获取队列长度
{
return list.size();
}
public Object QueuePeek()//查看队首元素
{
return list.getFirst();
}
public static void main(String[] args)//测试队列
{
LinkedQueue queue = new LinkedQueue();
System.out.println(queue.isQueueEmpty());
queue.enQueue("a");
queue.enQueue("b");
queue.enQueue("c");
queue.enQueue("d");
queue.enQueue("e");
queue.enQueue("f");
System.out.println(queue.QueueLength());
System.out.println(queue.deQueue());
System.out.println(queue.deQueue());
System.out.println(queue.QueuePeek());
System.out.println(queue.deQueue());
queue.clear();
queue.enQueue("s");
queue.enQueue("t");
queue.enQueue("r");
System.out.println(queue.deQueue());
System.out.println(queue.QueueLength());
System.out.println(queue.QueuePeek());
System.out.println(queue.deQueue());
}
}
2.下面是使用的地方,如果从服务器返回了消息就,把消息放到自定义的队列中去
private void faceAsync() {
//1.这里去同步照片到人脸库
//String faceUrl="http://172.19.128.73:8060/api/faceDevice/listByIp";
String server_ip = GetConfigValue.getConfigProperties("server_ip");
//String faceUrl="http://172.19.128.64:8061/api/faceDevice/listByIp";
String faceUrl= server_ip +"/api/faceDevice/listByIp";
OkHttpClient faceHttpClient = new OkHttpClient();
Request faceRequest = new Request.Builder()
.get()
.url(faceUrl)
.build();
//构造Call对象
Call faceCall=faceHttpClient.newCall(faceRequest);
faceCall.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, okhttp3.Response response) throws IOException {
String jsonStr =response.body().string();
//1.将base64,转换为图片
try {
respFaceArray=null; //清空一下
JSONObject jsonObj=new JSONObject(jsonStr);
respFaceArray =jsonObj.getJSONArray("data");
synchronized (this){
//jsonArrayArrayList.add(respFaceArray);
linkedQueue.enQueue(respFaceArray);
}
faceHandler.sendEmptyMessage(112);
response.body().close();
} catch (JSONException e) {
e.printStackTrace();
response.body().close();
}
}
});
}
3.添加了队列中去以后,然后从队列中去取出消息,取出消息以后,然后去处理
reentrantLock.lock();
//改成使用linkedqueue自定义的queue来操作
while (linkedQueue.isQueueEmpty() == false){
JSONArray jsonArray = (JSONArray) linkedQueue.deQueue();
faceServerHttp(jsonArray);
}
reentrantLock.unlock();
可以看到,判断死循环,只要是队列中有数据,就去获取一个数据,并且把数据从队列中删除钓,然后去处理
faceServerHttp(jsonArray); 就是去处理数据去.