四时宝库

程序员的知识宝库

AndroidStudio_android使用自己封装的消息队列_封装LinkedQueue

比如我要发送一个请求,给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); 就是去处理数据去.







发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接