adnroid 线程频繁上传等耗时操作优化方案

实现思路,创建一个全局线程,开始就启动并且休眠,等待通知,
实在两个List集合,一个设置为空对象的集合,生产和消费的时候加锁和释放
1、全局线程
开始就启动

  if (myFaceThread == null) {//启动线程
                    myFaceThread = new MyFaceThread();
                    myFaceThread.start();
                }

 class MyFaceThread extends Thread {
            @Override
            public void run() {
                super.run();
                Log.i("fenxi", "准备上传");
                while (true) {
                    synchronized (mReadyList) {
                        try {
                            Log.i("fenxi", "获得锁");
                            mReadyList.wait(); //获得锁,等待通知
                        } catch (Exception e) {
                            e.printStackTrace();
                            Log.i("fenxi", "Exception");
                        }
                        while (true) {
                            FaceBuff tmp = null;
                            if (mReadyList.size() > 0) {
                                mwLock.writeLock().lock();
                                tmp = mReadyList.remove(0);//准备
                                mwLock.writeLock().unlock();
                                if (tmp != null) {
                                    //上传操作
                                    //upload success
                                    //start send porotobuf
                                    //send
                                }
                            } else {
                                Log.i("fenxi", "break");
                                break;
                            }
                        }
                    }
                }
            }
        }

③、准备:

private ReadWriteLock mrwLock = new ReentrantReadWriteLock();//锁
private ReadWriteLock mwLock = new ReentrantReadWriteLock();//锁
private List<Bean> mReadyList = new ArrayList<>();//准备好使用消费
private List<Bean> mFreeList = new ArrayList<>();//空闲的
private void setmFreeList() {
        for (int i = 0; i < 5; i++) {
            Baen bean= new Baen ();
            mFreeList.add(bean);
        }
    }

使用:

                        mrwLock.writeLock().lock();
                        if (mFreeList.size() > 0) {
                            Log.i("fenxi", "mFreeList.size==" + mFreeList.size());
                            temp = mFreeList.remove(0);
                        }
                        mrwLock.writeLock().unlock();
                        Log.i("fenxi", "mFreeList.size()==" + mFreeList.size());
                        if (null != temp) {
                            Log.i("fenxi", "null != temp");
                            temp.setFaceCountBaen(faceCountBaen);
                            temp.setFilename(fileName);//设置图片路径
                            mrwLock.writeLock().lock();
                            mReadyList.add(temp);
                            mrwLock.writeLock().unlock();
                            Log.i("fenxi", "mFreeList.size()==" + mFreeList.size());
                        }
                          //什么时候通知线程
                         if(){
                                 synchronized (mReadyList) {
                                    Log.i("fenxi", "释放锁");
                                    mReadyList.notify();//通知发送
                                }
                        }

猜你喜欢

转载自blog.csdn.net/u012901807/article/details/86642639