(andbase)android 线程池 显示进度框和移除进度框 Toast提示文本

Java ExecutorService线程池中的小坑——关于线程池中抛出的异常处理 开发自己的项目有一段时间了,因为是个长时间跑的服务器端程序,所以异常处理显得尤为重要。 对于异常的抓取和日志(狭义上的日志)的分析一点都不能落下。 我们使用了Java自带的Executor模块,我只是稍微看了下Executors当中三个线程池的实现(策略为:Fixed, Cached, Schedule),其实光看名字就可以了解各自的一些策略信息。OK,这一次我需要一种策略合并Fixed和C 阅读详情

1.显示进度框和移除进度框


/** 加载框的文字说明. */
private String mProgressMessage = "请稍候...";

/** 全局的加载框对象,已经完成初始化. */
public ProgressDialog mProgressDialog;


/**

 * 描述:显示进度框.
 */
public void showProgressDialog() {
showProgressDialog(null);
    }

/**
 * 描述:显示进度框.
 * @param message the message
 */
public void showProgressDialog(String message) {
// 创建一个显示进度的Dialog
if(!AbStrUtil.isEmpty(message)){
mProgressMessage = message;
}
if (mProgressDialog == null) {
mProgressDialog = new ProgressDialog(this);
// 设置点击屏幕Dialog不消失    
mProgressDialog.setCanceledOnTouchOutside(false);
}
mProgressDialog.setMessage(mProgressMessage);
showDialog(AbConstant.DIALOGPROGRESS);
    }


/**
 * 描述:移除进度框.
 */
public void removeProgressDialog() {

   removeDialog(AbConstant.DIALOGPROGRESS); 

}



2.Toast提示文本


    /**
     * 描述:Toast提示文本.
     * @param text  文本
     */
public void showToast(String text) {
Toast.makeText(this,""+text, Toast.LENGTH_SHORT).show();
}

    /**
     * 描述:Toast提示文本.
     * @param resId  文本的资源ID
     */
public void showToast(int resId) {
Toast.makeText(this,""+this.getResources().getText(resId), Toast.LENGTH_SHORT).show();
}


3.在线程中提示文本信息


/**
* 描述:在线程中提示文本信息.
* @param resId 要提示的字符串资源ID,消息what值为0,
*/
public void showToastInThread(int resId) {
Message msg = baseHandler.obtainMessage(0);
Bundle bundle = new Bundle();
bundle.putString("Msg", this.getResources().getString(resId));
msg.setData(bundle);
baseHandler.sendMessage(msg);
}

/**
* 描述:在线程中提示文本信息.
* @param toast 消息what值为0
*/
public void showToastInThread(String toast) {
Message msg = baseHandler.obtainMessage(0);
Bundle bundle = new Bundle();
bundle.putString("Msg", toast);
msg.setData(bundle);
baseHandler.sendMessage(msg);
}



4.线程池


/**
 * The Class AbAppData.
 */
public class AbAppData {

/** 日志开关. */
public static  boolean DEBUG = false;

/** 性能测试. */
public static boolean mMonitorOpened = false;

/** 起始执行时间. */
public static long startLogTimeInMillis = 0;


}

/**
 * 
 * Copyright (c) 2012 All rights reserved
 * 名称:AbTaskPool.java 
 * 描述:线程池,程序中只有1个
 * @author zhaoqp
 * @date:2013-5-23 上午10:10:53
 * @version v1.0
 */


public class AbTaskPool{

/** The tag. */
private static String TAG = "AbTaskPool";

/** The Constant D. */
private static final boolean D = AbAppData.DEBUG;

/** 单例对象 The http pool. */
private static AbTaskPool mAbTaskPool = null; 

/** 固定5个线程来执行任务. */
private static int nThreads  = 5;

/** 线程执行器. */
private static ExecutorService executorService = null; 

/** 下载完成后的消息句柄. */
    private static Handler handler = new Handler() { 
        @Override 
        public void handleMessage(Message msg) { 
        AbTaskItem item = (AbTaskItem)msg.obj; 
        if(item.getListener() instanceof AbTaskListListener){
        ((AbTaskListListener)item.listener).update((List<?>)item.getResult()); 
        }else if(item.getListener() instanceof AbTaskObjectListener){
        ((AbTaskObjectListener)item.listener).update(item.getResult()); 
        }else{
        item.listener.update(); 
        }
        } 
    }; 
    
    /**
     * 初始化线程池
     */
    static{
    nThreads = AbAppUtil.getNumCores();
    mAbTaskPool = new AbTaskPool(nThreads*5); 
    }

/**
* 构造线程池.
*
* @param nThreads 初始的线程数
*/
    protected AbTaskPool(int nThreads) {
    executorService = Executors.newFixedThreadPool(nThreads); 
    } 

/**
* 单例构造图片下载器.
*
* @return single instance of AbHttpPool
*/
    public static AbTaskPool getInstance() { 
        return mAbTaskPool;
    } 
    
    /**
     * 执行任务.
     * @param item the item
     */
    public void execute(final AbTaskItem item) {    
    executorService.submit(new Runnable() { 
    public void run() {
    try {
    //定义了回调
                    if (item.listener != null) { 
                    item.listener.get();
                    //交由UI线程处理 
                        Message msg = handler.obtainMessage(); 
                        msg.obj = item; 
                        handler.sendMessage(msg); 
                    }                              
    } catch (Exception e) { 
    e.printStackTrace();
    }                         
    }                 
    });                 
   
    }
    
    
    /**
     * 
     * 描述:获取线程池的执行器
     * @return executorService
     * @throws 
     */
    public static ExecutorService getExecutorService() {
return executorService;
}




/**
     * 描述:立即关闭.
     */
    public void shutdownNow(){
    if(!executorService.isTerminated()){
    executorService.shutdownNow();
    listenShutdown();
    }
   
    }
    
    /**
     * 描述:平滑关闭.
     */
    public void shutdown(){
    if(!executorService.isTerminated()){
      executorService.shutdown();
      listenShutdown();
    }
    }
    
    /**
     * 描述:关闭监听.
     */
    public void listenShutdown(){
    try {
while(!executorService.awaitTermination(1, TimeUnit.MILLISECONDS)) { 
if(D) Log.d(TAG, "线程池未关闭");
}  
if(D) Log.d(TAG, "线程池已关闭");
} catch (Exception e) {
e.printStackTrace();
}
    }
}




5.数据执行单位

public class AbTaskItem { 

/** 记录的当前索引. */
public int position;
 
  /** 执行完成的回调接口. */
    public AbTaskListener listener; 
    
    /** 执行完成的结果. */
    private Object result;


public int getPosition() {
return position;
}


public void setPosition(int position) {
this.position = position;
}


public AbTaskListener getListener() {
return listener;
}


public void setListener(AbTaskListener listener) {
this.listener = listener;
}


public Object getResult() {
return result;
}


public void setResult(Object result) {
this.result = result;
} 
    
} 

6.任务执行的控制父类


public class AbTaskListener {

/**
* 描述:执行开始后调用.
*/
public void get(){}; 

/**
* 描述:执行开始后调用.
*/
public void update(){}; 


}

7.具体实现

        //线程池
        poolBtn.setOnClickListener(new View.OnClickListener() {


@Override
public void onClick(View arg0) {
//显示进度框
showProgressDialog();
AbTaskPool mAbTaskPool = AbTaskPool.getInstance();
//定义异步执行的对象
    final AbTaskItem item = new AbTaskItem();
item.listener = new AbTaskListener() {


@Override
public void update() {
removeProgressDialog();
showToast("执行完成");
}


@Override
public void get() {
     try {
      showToastInThread("开始执行");
      Thread.sleep(1000);
      //下面写要执行的代码,如下载数据
     } catch (Exception e) {
     }
 };
};
//开始执行
mAbTaskPool.execute(item);
}
       
        });


Android 多线程下载+UI进度条刷新 http://blog.youkuaiyun.com/sky286753213/article/details/11770299 立即下载

相关推荐

高仿IOS自定义Toast、自定义加载中进度框。绝美!

高端大气上档次 低调奢华有内涵 ++++++++++++++++++++++++++++++++++++++++ 本Demo包含两个控件: 1.自定义Toast提示,高仿IOS的屏幕中间提示,效果可以参考android版腾讯新闻的提示。还有一个重要特点:多次连续点击不会产生多个Toast队列不停的一直显示,而是直接更新当前Toast的视图,效果绝对棒! 2.自定义加载进度框,类似上面的Toast提示,屏幕半透明,阻挡用户继续点击。 以上代码全都封装好了,copy到你们自己项目就可以直接用,源码、资源文件都有。可以先安装apk看效果哈。 精品代码,绝对值5分。童叟无欺,不下后悔!

Android中提示框与线程

消息提示框 1.  Toast.makeText(当前上下文, "名字或密码错误", Toast.LENGTH_SHORT).show();      1.1 Toast是Android中的一种简单的消息提示框      1.2 使用这个类的最简单的方法是调用静态方法构造您所需要的一切,并返回一个新的Toast对象。           第一个参数:当前的上下文,可用getApplicationC...

嗯很喜欢你 746

Android AndBase框架内部封装实现进度框、Toast框、弹出框、确认框(二)

主要介绍了Android AndBase框架使用AbActivity内部封装实现进度框、Toast框、弹出框、确认框,感兴趣的小伙伴们可以参考一下

详解Android 关机/重启流程

android;framework;关机;重启;sys.powerctl;关机对话框

luyu22的博客 4480

CrewAI 多 Agent 实战包 v1(Mock免Key跑通+通义千问可选+流水线样例)

本资源是 CrewAI 风格多 Agent 可运行工程包:研究→写作→审校等流水线样例。无 API Key 时自动降级 Mock 引擎跑通;有 DASHSCOPE_API_KEY 时可接真实 CrewAI + 通义千问。含中文 README、samples、smoke 留档、单元测试。本包不含密钥。关联博客:https://blog.youkuaiyun.com/mtl1994

手把手教你用FreeModbus RTU协议栈实现STM32与PLC通信(附Keil工程)

本文详细介绍了如何使用FreeModbus RTU协议栈在STM32上实现与PLC的工业通信。从环境搭建、工程配置到关键移植接口实现,提供了Keil工程模板和调试技巧,帮助开发者快速掌握Modbus RTU通信技术,适用于工业自动化领域的设备间通信需求。

weixin_42549037的博客 418

15、android 用toast实现简单的进度显示

1 if(mtoast!=null) 2 { 3 mtoast.setText(progress); 4 } 5 ...

weixin_33911824的博客 489

基于R和gephi做宏基因组与代谢组等多组学联合network相关性网络图

拿到多组学的数据后一直在找合适的方法将二者进行关联,比如我这里是三种体液的代谢组与一种体液的宏基因组。需求是对多组学进行关联分析,直到最近看到不少文章里利用Gephi将相关性表格进行可视化的图,效果还不错,于是写个过程记录自用。这里演示的是属水平的差异菌群相对丰度(宏基因组结果)与代谢组鉴定到的差异代谢物进行关联。先是计算相关性生成graphml格式文件使用Gephi软件进行可视化。

twocanis的博客 6786

常用控件02 图片框与进度条

案例一:消息提示框 Toast(吐丝框) 1.1 Toast是Android中的一种简易的消息提示框 1.2 使用这个类的最简单的方法是调用静态方法构造您所需要的一切,并返回一个新的Toast对象。 Toast toast=Toast.makeText(getApplicationContext(), “默认的Toast”, Toast.LENGTH_SHORT); toast.show();...

qq_43226989的博客 318

立创开源TinyAWG:基于ZYNQ7010的35MHz带宽200MSa/s任意波形发生器设计与实现

本文详细解析了立创开源TinyAWG的设计与实现,这是一款基于ZYNQ7010芯片的低成本高性能任意波形发生器。项目实现了35MHz带宽和200MSa/s采样率,核心采用ARM+FPGA协同架构,FPGA负责高速DDS信号生成,ARM运行Linux并搭载LVGL图形界面。文章涵盖了硬件选型、电路设计、软件逻辑及性能测试,为复刻和学习ZYNQ系统设计、高速DAC应用提供了完整参考。

weixin_42576467的博客 433

EMB电子机械制动系统冗余备份方案介绍

随着汽车智能化技术的快速发展,自动驾驶技术的不断升级,对车辆制动系统的可靠性和安全性提出了更高要求。根据国际汽车安全法规(如UN R13-H)的最新修订,L3级及以上自动驾驶车辆必须配备具有冗余功能的制动系统,以确保在任何单一故障发生时仍能维持部分或全部制动能力。本文重点讨论最具前瞻性的EMB(电子机械制动)系统的冗余备份设计方案

m0_59012156的博客 853

Android利用Toast弹出提示信息:

Toast.makeText(MainActivity.this,“内容”,Toast.LENGTH_SHORT).show();

兔丸的博客 6419

AUTOSAR&UDS 理论要点及isolar实战-DEM模块

从这节开始,将讲解UDS诊断中非常重要的知识点:故障事件触发、故障信息上报、故障信息处理、故障信息存储和故障系统降级,后续会陆续更新。

cqaa11的博客 552

Java四种线程池的使用

Java通过Executors提供四种线程池,分别为: newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。 newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。 newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。

Toast_qi 706

lp–mspm0g3507开发板进入低功耗模式怎么退出?烧程序烧着烧着就进来了,跳线帽没动过,且报错:Texas Instruments Debugger Error: DAP Co...如何解决?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1569

华为OD机试 - 计算数列位置N的值 - 模拟法(Python/JS/C/C++ 新系统 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。输入 M,N 两个数,则按照以下规则形成一个数列。数列的前 M 个元素的值为 1 到 M从 M+1 个元素开始,计算逻辑为如果其前 M 个元素中,存在值相同的元素,则该位置上的数值等于前 M 个数中最大数值与最小数值之和。如果其前 M 个元素中,

学Java,找哪吒 508

Toast和Progressbar结合的实例

当你网络等待,进度加载时,是否很需要一个Toast加上一个progressbar

qq602298560的专栏 794

Dify 第 14 篇 Dify 知识库改造案例,如何返回完整文档?

在使用Dify社区版v1.7.1的知识库功能时,遇到检索仅返回匹配的文本片段而非完整文档的问题。针对运维案例知识库的需求,尝试了三种解决方案: 调整Chunk大小:通过设置最大分段长度为4000字符,但无法满足超过该长度的文档需求。 增加返回Chunk数量:通过调整Top K参数,但最大仅支持10个片段,且可能包含无关内容。 调用知识库API:通过检索接口获取匹配文档ID,再查询该文档所有分段内容,从而获得完整信息。具体步骤包括生成API密钥、获取知识库ID,并通过HTTP请求实现。 最终推荐采用AP

甘蓝的专栏 1968

使用android ProgressBar和Toast生成一个界面

首先我需要这样一个界面 这个界面是在使用AudioManager.adjustStreamVolume(int streamType, int direction, int flags)显示出来的,记住flags这里传 AudioManager.FLAG_SHOW_UI才会显示 不然只是逻辑上调整了某个流的声音,用户他看不到界面不知道成功与否。 然后我有一个功能界面是和这个一样的,但功能...

weixin_33736832的博客 169

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

常用控件与图片框

Toast(吐丝框) 1.1 Toast是Android中的一种简易的消息提示框 1.2 使用这个类的最简单的方法是调用静态方法构造您所需要的一切,并返回一个新的Toast对象。 Toast toast=Toast.makeText(getApplicationContext(), “默认的Toast”, Toast.LENGTH_SHORT); toast.show(); ...

qq_41683274的博客 588

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

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

子线程能弹Toast吗

子线程能弹Toast吗? 相信很多安卓开发者都坚信一个信念,那就是子线程不能更新UI,不能进行UI操作,写此文之前,我自己也是这么坚信的,直到我注意到一个异常,才引发我对子线程不能更新UI有了新的认识。这个异常是在我在子线程里面不小心弹了一个Toast引发的,该异常相信很多朋友都见过,就是 java.lang.RuntimeException: Can't create handler ins...

海纳百川Android的博客 9014

Dialog、Toast、Snackbar,你真的了解它们吗?

亲自执笔,继续带你从细节上深入学习Android。

郭霖 947

android 线程 弹出对话框

android 线程 弹出对话框 多线程,在线程中用handler实现弹出对话框 Handler handler = new Handler() { public void handleMessage(Message paramMessage) { comm.showDialog("添加成功!", ShopAddActivit...

saydo 3106

使用ExecutorService时遇到的坑

线上服务中有个使用 Spring 的scheduling.quartz的定时任务,每天凌晨1点向表里面灌初始数据,一个线程一台服务器在跑,刚上线的时候4个小时跑完,后来随着用户的激增,要下下午6点才结束,后来同事做了多线程优化,效果不显著,耗时依旧严重,Zzzzzzz~~~~ 于是clone 代码看了下,感觉ExecutorService的使用怪怪的: // 10个线程,因为任务多,...

weixin_30656145的博客 627
上一篇: Android ListView控件基本用法
下一篇: 115个Java面试题及回答
GodShare
博客等级 码龄15年 3粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值