Android学习3: SurfaceView与多线程混搭

【阿里云大模型高级工程师ACP习题集】2.9 大模型应用生产实践(下篇) 【摘要】这是我精心整理出对应的习题集,里面足足有 30 道题目,从基础概念到深度拓展,全方位覆盖章节重点、难点。不管你是想检验自己的学习成果,还是想针对薄弱环节进行强化训练,它都能完美适配! 阅读详情
今天学习了一下Android里面的多线程调用.
使用SurfaceView来显示系统文件夹下面的一些图像.
一个线程来读取图片生成Bitmap, 另个一下线程来绘制图片.
这个例子还是有一些BUG, 生成的Bitmap也可能为空. 产生程序异常.
别外就是改成可以读取任意文件夹下的图片可以绘更好一些.

算了不纠结了, 继续往后看吧.


里面还有一个回调函数.貌似有点不好理解.

sfh.addCallback(new MyCallBack());


layout/activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <LinearLayout
        android:orientation="horizontal"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:id="@+id/linearLayout">

        <Button
            android:layout_width="120dp"
            android:layout_height="40dp"
            android:text="启动多线程"
            android:id="@+id/button" />
    </LinearLayout>

    <SurfaceView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/surfaceView"
        android:layout_below="@+id/linearLayout"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />
</RelativeLayout>



com/example/youtwo/testthread/MainActivity.java

package com.example.youtwo.testthread;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.widget.Button;

import java.lang.reflect.Field;
import java.util.ArrayList;


public class MainActivity extends ActionBarActivity {

    Button btnDoubleThread;
    SurfaceView sfv;
    SurfaceHolder sfh;
    int imgWidth, imgHeight;
    ArrayList imgList = new ArrayList();
    Bitmap bitmap;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化按钮
        btnDoubleThread = (Button) this.findViewById(R.id.button);
        btnDoubleThread.setOnClickListener(new ClickEvent());

        // 初始化绘图容器
        sfv = (SurfaceView) this.findViewById(R.id.surfaceView);
        sfh = sfv.getHolder();
        // 自动运行surfaceCreated以及surfaceChanged
        sfh.addCallback(new MyCallBack());

        bitmap = null;
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    class ClickEvent implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            if (v == btnDoubleThread) {
                new LoadImage().start();//开一条线程读取
                new DrawImage(imgWidth + 10, 0).start();//开一条线程绘图
            }
        }
    };

    class MyCallBack implements SurfaceHolder.Callback {

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                                   int height) {
            Log.i("Surface:", "Change");

        }

        @Override
        public void surfaceCreated(SurfaceHolder holder) {
            Log.i("Surface:", "Create");

            // 用反射机制来获取资源中的图片ID和尺寸
            Field[] fields = R.drawable.class.getDeclaredFields();
            for (Field field : fields) {
                if (!"icon".equals(field.getName()))// 除了icon之外的图片
                {
                    int index = 0;
                    try {
                        index = field.getInt(R.drawable.class);
                    } catch (IllegalArgumentException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    // 保存图片ID
                    imgList.add(index);
                }
            }
            // 取得图像大小
            Bitmap bmImg = BitmapFactory.decodeResource(getResources(),
                    (Integer) imgList.get(0));
            imgWidth = bmImg.getWidth();
            imgHeight = bmImg.getHeight();
        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {
            Log.i("Surface:", "Destroy");

        }

    };

    /*
     * 只负责绘图的线程
     */
    class DrawImage extends Thread {
        int x, y;

        public DrawImage(int x, int y) {
            this.x = x;
            this.y = y;
        }

        public void run() {
            while (true) {
                if (bitmap != null) {//如果图像有效
                    // 获取屏幕大小
                    DisplayMetrics dm = new DisplayMetrics();
                    getWindowManager().getDefaultDisplay().getMetrics(dm);

                    Canvas c = sfh.lockCanvas(new Rect(this.x, this.y,
                            dm.widthPixels, dm.heightPixels));

                    Paint mPaint = new Paint();
                    // 清除屏幕
                    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
                    c.drawPaint(mPaint);
                    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));

                    if(bitmap != null) {
                        // 把系统图标缩放到当前窗口的大小显示
                        Rect src = new Rect(0,0,bitmap.getWidth(), bitmap.getHeight());
                        RectF dst = new RectF(0,0,dm.widthPixels,dm.heightPixels);
                        c.drawBitmap(bitmap, src, dst, mPaint);
                    }

                    sfh.unlockCanvasAndPost(c);// 更新屏幕显示内容
                }
            }
        }
    };

    /*
     * 只负责读取图片的线程
     */
    class LoadImage extends Thread {
        int imgIndex = 0;

        public void run() {
            while (true) {
                bitmap = BitmapFactory.decodeResource(getResources(),
                        (Integer) imgList.get(imgIndex));
                imgIndex++;
                if (imgIndex == imgList.size())//如果到尽头则重新读取
                    imgIndex = 0;
            }
        }
    };
}



手把手教你学veriolg(二十六)-- Verilog CIC 滤波器设计 目录 Verilog CIC 滤波器设计1. CIC 滤波器的基本原理2. Verilog 实现3. 说明4. 测试激励5. 总结 CIC(Cascade-Integrator-Comb)滤波器是一种特殊的数字滤波器,常用于多速率信号处理中,尤其是用于信号的上采样(插值)和下采样(抽取)。CIC 滤波器的特点在于它具有简单的硬件实现、不需要乘法器(仅使用加法器和延迟元件)、且具有线性相位特性。然而,CIC 滤波器的缺点是它会产生较大的量化误差,因此在设计时需要特别注意字长的选择以避免溢出。1. CIC 滤波 阅读详情

相关推荐

一文搞懂 RC Correlation Scale Factor 的生成与应用

pre-route 用的是统计估算模型,post-route 用的是详细布线提取,signoff 用的是第三方 QRC 或 StarRC——三个工具,三套参数体系,结果自然天差地别。不同 RC corner(rc_worst/rc_best/rc_typical)对应不同的工艺角和温度环境,每个 corner 的 R/C 偏差比例不同,必须分别生成和应用各自的 scale factor。别被名字骗了,这个工具专门干一件事——统计拟合两组 SPEF 之间的偏差,自动推荐最优 scaling factor。

weixin_47770727的博客 558

Android提高第三篇之SurfaceView与多线程的混搭

本文来自http://blog.youkuaiyun.com/hellogv/ ,引用必须注明出处! 上一篇简单介绍了SurfaceView的基本使用,这次就介绍SurfaceView与多线程的混搭。SurfaceView与多线程混搭,是为了防止动画闪烁而实现的一种多线程应用。android的多线程用法与JAVA的多线程用法完全一样,本文不做多线程方面的介绍了。直接讲解SurfaceView与多线程的混合...

t225com 204

WRF和WPS模型在Ubuntu系统上的安装与常见问题解决指南

本文详细介绍了在Ubuntu系统上安装WRF和WPS模型的完整教程,涵盖系统环境配置、依赖库安装、源代码编译以及常见问题的解决方案。重点解决了WPS编译中intmath.f文件的修改、环境变量设置和编译器兼容性等关键难点,帮助用户高效部署气象研究与预报模型。

weixin_29213525的博客 382

Surfaceview 与多线程 写得好。

上一篇简单介绍了SurfaceView的基本使用,这次就介绍SurfaceView与多线程的混搭。SurfaceView与多线程混搭,是为了防止动画闪烁而实现的一种多线程应用。android的多线程用法与JAVA的多线程用法完全一样,本文不做多线程方面的介绍了。直接讲解SurfaceView与多线程的混合使用,即开一条线程专门读取图片,另外一条线程专门绘图。         本文程序运行截图

孔令宽的专栏 920

使用 FastAPI 构建高性能异步接口服务(含完整项目示例)

python复制编辑python复制编辑= 1: raise HTTPException(status_code=404, detail="用户不存在")特性FastAPI 支持情况类型注解✅自动文档✅异步支持✅ORM 集成✅(推荐 SQLModel)性能✅ 极高FastAPI 是你构建现代化、高性能 Python Web 应用的首选框架!

2501_92823525的博客 1302

语音测试(二)音频标注(praat)

通过点击红线下方的圆点进行区域划分,在区域中标注所属的类别。按住Alt+Backspace 键取消蓝色线条。

beishida123的博客 3735

Android Camera2使用SurfaceView进行简单预览和绘制

最近项目上需要在相机上做些开发,之前对这块不是很了解,就学习下,这里使用的Camera2进行开发测试调试的手机是vivo Y9s(Andrioid9.0) 下面是主要流程步骤 检测是否有相机设备 检测相关相机权限 开启线程打开相机(>=21和<21) 预览过程 简单绘制 其中预览过程最为复杂或者需要下功夫去了解下的。 // 检测手机是否有摄像头 presenceCamera = checkCameraHardware(Camera.this);

wulileaf的博客 5010

6.4 实战项目:基于Agent内核构建Code Review智能体

本文介绍了一个基于Agent内核构建的智能Code Review系统实战项目。系统采用多Agent协作架构,包含代码质量分析、安全漏洞识别、性能优化建议等核心功能模块。文章详细展示了系统架构设计,采用协调器Agent管理多个专业Agent协同工作,并提供了基础Agent框架和协调器Agent的TypeScript实现代码。项目结合了AI Agent核心原理和多Agent协作机制,实现了自动化的代码审查流程,能够生成详细的审查报告,帮助开发者提升代码质量和安全性。

yonggeit的博客 3110

Android系统Surface机制的SurfaceFlinger服务的线程模型分析

在前面两篇文章中,我们分析了SurfaceFlinger服务的启动过程以及SurfaceFlinger服务初始化硬件帧缓冲区的过程。从这两个过程可以知道,SurfaceFlinger服务在启动的过程中,一共涉及到了三种类型的线程,它们分别是Binder线程、UI渲染线程和控制台事件监控线程。在本文中,我们就将详细分SurfaceFlinger服务的线程模型,即上述三种类型的线程是如何运行和交...

移动开发记录 286

【图像超分】论文复现:新手入门!Pytorch实现SRCNN,数据预处理、模型训练、测试、评估全流程详解,注释详细,简单修改就可以训练你自己的图像数据,有训练好的模型下载地址,随取随用

【图像超分】论文精读:Image Super-Resolution Using Deep Convolutional Networks(SRCNN)请配合上述论文精读文章使用,效果更佳!图像超分辨率SRCNN和FSRCNN复现代码,除基本的网络实现外,还有特征图可视化,PSNR曲线图可视化,测试自己的图像数据等不想理解原理,希望直接跑通然后应用到自己的图像数据的同学,请直接下载上面的代码,有训练好的模型,直接用即可。具体使用方式见代码中的README!有问题来本文评论区留言!准备数据集,以及数据预处理。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 2万+

STM32G431的 FDCAN使用5M加速时,出现奇葩问题,如何解决?

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 1640

安卓SurfaceView+HandlerThread的使用

在SurfaceTestView 初次加载的时候,先创建 HandlerThread 对象,调用 HandlerThread 的 start() 方法启动线程,再创建一个 Handler 与 HandlerThread 的 Looper 绑定,这样mHandler 发送的所有消息都会交给mHandlerThread 的Looper进行处理,在绑定完成后调用update()方法对ui进行初次绘制,这样就的到的一个“当前:0”的简单文本。① 可以在独立的线程中进行绘制操作,避免主线程的阻塞;

weixin_41119184的博客 712

《YOLOv8:从入门到实战》报错解决 & 专栏答疑

《YOLOv8:从入门到实战》专栏上线后,部分同学在学习过程中提出了一些问题,笔者相信这些问题其他同学也有可能遇到。为了让大家可以更好地学习本专栏内容,笔者特意推出了该篇专栏答疑,针对同学们在学习过程中所提出的问题进行汇总记录,并不断实时更新,希望能够帮助到大家!🌈

小哥谈 1241

android surfaceview 多线程,Android提高之SurfaceView与多线程的混搭实例

前文简单介绍了Android中SurfaceView的基本使用,本文就来介绍一下SurfaceView与多线程的混搭。SurfaceView与多线程混搭,是为了防止动画闪烁而实现的一种多线程应用。android的多线程用法与JAVA的多线程用法完全一样,本文不做多线程方面的介绍了。直接讲解SurfaceView与多线程的混合使用,即开一条线程专门读取图片,另外一条线程专门绘图。本文程序运行截图如下...

weixin_42639633的博客 207

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

android surfaceview 多线程,Android提高第三篇之SurfaceView与多线程的混搭 转载

packagecom.testSurfaceView;importjava.lang.reflect.Field;importjava.util.ArrayList;importandroid.app.Activity;importandroid.graphics.Bitmap;importandroid.graphics.BitmapFactory;importandroid.gr...

weixin_35411487的博客 152

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android+多线程和双缓冲,21天学习android开发教程之SurfaceView与多线程的混搭

上一篇简单介绍了SurfaceView的基本使用,这次就介绍SurfaceView与多线程的混搭。SurfaceView与多线程混搭,是为了防止动画闪烁而实现的一种多线程应用。android的多线程用法与JAVA的多线程用法完全一样,本文不做多线程方面的介绍了。直接讲解SurfaceView与多线程的混合使用,即开一条线程专门读取图片,另外一条线程专门绘图。本文程序运行截图如下,左边是开单个线程读...

weixin_39637614的博客 91

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

3.SurfaceView与多线程的混搭

上一篇简单介绍了SurfaceView的基本使用,这篇就介绍SurfaceView与多线程的混搭。SurfaceView与多线程混搭,是为了防止动画闪烁而实现的一种多线程应用技术。android的多线程用法与Java的多线程用法完全一样,本文不做多线程方面的介绍了。直接讲解SurfaceView与多线程的混合使用,即开一条线程专门读取图片,另外一条线程专门绘图。 先看效果图,左边是开单个线程

天。朝程序猿的专栏 984

SurfaceView与多线程的混搭

转自http://blog.youkuaiyun.com/hellogv/article/details/5986835 SurfaceView与多线程混搭,是为了防止动画闪烁而实现的一种多线程应用技术。android的多线程用法与Java的多线程用法完全一样,本文不做多线程方面的介绍了。直接讲解SurfaceView与多线程的混合使用,即开一条线程专门读取图片,另外一条线程专门绘图。 先看效果图,左边是

u010436741的专栏 1066
上一篇: Android学习2: Android使用SurfaceView绘制一条移动的线段
下一篇: Android学习4:Android的Activity小记
robertkun
博客等级 码龄19年 252粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值