安卓多线程——AsyncTask

          在采集视频的同时需要对视频进行实时处理,因此要使用到多线程。

       AsyncTask是android提供的一个处理异步任务的框架,相当于Handler+Thread。相比而言,AsyncTask的优点是封装良好,代码简洁。

使用AsyncTask可以使你在后台执行耗时任务(doInBackground)并将结果反馈给UI线程(onPostExecute),方便UI线程更新界面,而不会阻塞UI线程。

         参考链接:http://www.netfoucs.com/article/RowandJJ/69121.html

使用的代码:

   //2. 开启一个线程进行实施处理帧
    /*自定义的IndentifyTask类,开启一个线程分析数据*/
    private class IndentifyTask extends AsyncTask<Void, Void, Void>{

        private byte[] mData;
        //构造函数
        IndentifyTask(byte[] data){
            this.mData = data;
        }
        
        @Override
        protected Void doInBackground(Void... params) {
            // TODO Auto-generated method stub
            //Size size = myCamera.getParameters().getPreviewSize(); //获取预览大小
            final int w = myCamera.getParameters().getPreviewSize().width;  //宽度
            final int h = myCamera.getParameters().getPreviewSize().height;
            final YuvImage image = new YuvImage(mData, ImageFormat.NV21, w, h, null);
            ByteArrayOutputStream os = new ByteArrayOutputStream(mData.length);
            if(!image.compressToJpeg(new Rect(0, 0, w, h), 100, os)){
                return null;
            }
            byte[] tmp = os.toByteArray();
            Bitmap bmp = BitmapFactory.decodeByteArray(tmp, 0,tmp.length); 
            //doSomethingNeeded(bmp);   //自己定义的实时分析预览帧视频的算法
            processBmp( bmp );//自己定义的实时分析预览帧视频的算法

          return null;
        }    
    } 

//1.建立一个全局变量
IndentifyTask m_IndentifyTask ;

//3.在处理帧函数里面添加处理逻辑

@Override
public void onPreviewFrame(byte[] data, Camera arg1) {
	if(starttime  == 0) {
		starttime = System.currentTimeMillis();
			}
	long time = System.currentTimeMillis()-starttime;
	long current = time / 1000;
	Log.d("video", "video recorder =========================remains  "+current +"  "+(time % 1000));

	//在处理帧函数里面添加处理逻辑
	switch(m_IndentifyTask.getStatus()){
			            case RUNNING:
			                return;
			            case PENDING:
			            	m_IndentifyTask.cancel(false);
			                break;
						}
	m_IndentifyTask= new IndentifyTask(data);
	m_IndentifyTask.execute((Void)null);
						
}


原文地址:https://www.cnblogs.com/wishchin/p/9200152.html