android开发杂记一

填坑一:

viewpager+fragment(3个fragment),其中有一个fragment内有listview,listeview内含有播放视频控件时,进入到界面会闪屏一次。
原因是:listview内item的视频控件在fragment,fragment在activity是动态添加的,不会随着activity的初始化而刷新,只有在加载完fragment的时候加载刷新,所有会出现一次闪屏。这个时候只要在activityde xml界面内添加一段代码即可:
 <SurfaceView
        android:layout_width="0dp"
        android:layout_height="0dp" />

填坑二:

从上一个坑爬出,继续下一个,listview内item视频控件需要显示缩略图,这里播放的是网络视频,所有是由url的,具体实现代码是:
 public Bitmap createVideoThumbnail(String url, int width, int height) {
            Bitmap bitmap = null;
            MediaMetadataRetriever retriever = new MediaMetadataRetriever();
            int kind = MediaStore.Video.Thumbnails.MINI_KIND;
            try {
                if (Build.VERSION.SDK_INT >= 14) {
                    retriever.setDataSource(url, new HashMap<String, String>());
                } else {
                    retriever.setDataSource(url);
                }
                bitmap = retriever.getFrameAtTime();
            } catch (IllegalArgumentException ex) {
                // Assume this is a corrupt video file
            } catch (RuntimeException ex) {
                // Assume this is a corrupt video file.
            } finally {
                try {
                    retriever.release();
                } catch (RuntimeException ex) {
                    // Ignore failures while cleaning up.
                }
            }
            if (kind == MediaStore.Images.Thumbnails.MICRO_KIND && bitmap != null) {
                bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
                        ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
            }
            return bitmap;
        }

但是会出现卡顿的情况,因为这里是listview在使用,而且
MediaMetadataRetriever retriever = new MediaMetadataRetriever();
是一个耗时操作,所有我们的第一个反应是把它加在子线程中实现,UI线程显示,代码如下:
1.创建一个子线程:
static class CreateVideoThumbnail extends Thread {
    private String url;
    private Handler handler;

    public CreateVideoThumbnail(String url, Handler handler) {
        this.url = url;
        this.handler = handler;
    }

    @Override
    public void run() {
        super.run();
        handler.obtainMessage(0, createVideoThumbnail(url, 300, 300)).sendToTarget();
    }

    public Bitmap createVideoThumbnail(String url, int width, int height) {
        Bitmap bitmap = null;
        MediaMetadataRetriever retriever = new MediaMetadataRetriever();
        int kind = MediaStore.Video.Thumbnails.MINI_KIND;
        try {
            if (Build.VERSION.SDK_INT >= 14) {
                retriever.setDataSource(url, new HashMap<String, String>());
            } else {
                retriever.setDataSource(url);
            }
            bitmap = retriever.getFrameAtTime();
        } catch (IllegalArgumentException ex) {
            // Assume this is a corrupt video file
        } catch (RuntimeException ex) {
            // Assume this is a corrupt video file.
        } finally {
            try {
                retriever.release();
            } catch (RuntimeException ex) {
                // Ignore failures while cleaning up.
            }
        }
        if (kind == MediaStore.Images.Thumbnails.MICRO_KIND && bitmap != null) {
            bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height,
                    ThumbnailUtils.OPTIONS_RECYCLE_INPUT);
        }
        return bitmap;
    }
}
2.子线程把耗时操作完成,通知ui线程,代码如下:
Handler handler = new Handler(Looper.getMainLooper()) {
    @Override
    public void handleMessage(Message msg) {
        super.handleMessage(msg);
        if (ok) {
            ivThumb.setImageBitmap((Bitmap) msg.obj);
            ok = false;
        }

    }
};
3.现在准备工作完成,去调用子线程,代码:
t = new CreateVideoThumbnail(url, handler);
t.start();
4.还没完成,因为这是是listview在用,listview有复用功能,而且,你的子线程会一直在线程池中,你必须在上一个view消失的时候把线程取消掉,要不然会有2种情况出现,(1)报错(2)现在view使用的还是上一个view的数据,所有要先reset,在你视频播放之前使用代码:
public void reset() {
    if (t != null) {
        t.interrupt();
    }
    handler.removeMessages(0);
    ok = true;
}
5.最后考虑到生命周期,在view消失的时候再reset一下,虽然有时不考虑生命周期不会出现问题,但是有可能会把你的内存往上调一下(就是占用内存),有时它会直接报错。这里小分队提示,最好去考虑下生命周期更好。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UART1_RX_STA是一个状态标志,用于表示UART1接收数据的状态。根据引用\[1\]和引用\[3\]的内容,可以看出UART1_RX_STA是一个16位的变量,其中0~14位用来存储接收到的数据个数,15位和16位用来表示接收是否完成。当接收到数据时,UART1_RX_STA会自增,表示接收到的数据个数增加了。当接收到的数据以0x0d 0x0a结尾时,UART1_RX_STA的15位会被置为1,表示接收完成。在主函数中,可以通过判断UART1_RX_STA的值来判断接收是否完成,并读取UART1_RX_BUF\[\]数组中的数据。需要注意的是,在处理完串口数据后,需要将UART1_RX_STA清零。 #### 引用[.reference_title] - *1* [浅谈USART_RX_STA各位的描述以及是如何实现数据接收的](https://blog.csdn.net/JackCrum/article/details/99864683)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [(个人杂记)串口中断(关于USART_RX_STA的详细分析)](https://blog.csdn.net/canola_flowers/article/details/126178175)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [2021-10-31](https://blog.csdn.net/W2020492669/article/details/121062355)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值