android线程延迟
1. android延时加载的几种做法
在项目开发中,经常需要通过延时加载来实现满足我们的项目要求。那到底怎样来实现延时,下面结合java与android的相关方法来实现延时问题。
一.利用线程的Sleep方法
二. 利用Timer和TimerTask延时器
三.利用android自带的Handler消息处理
四.SchleExecutorService接口处理延时 迭代
2. android在主线程中使用handle.postdelay做延时操作对主线程资源消耗大吗
android在主线程中使用handle.postdelay做延时操作对主线程资源消耗不大,因为handler中有一个消息池,是静态的消息池, 建议去了解一下Android中的Handler, Looper, MessageQueue之间的关系就知道了.
3. 安卓线程handler.post传送消息有延时,怎么办
延迟是跟网络有关系的,HANDLER.POST没有大多关联。我用的时候也出现同样的问题 换网络就原满解决了,请采纳
4. 安卓线程handler.post传送消息有延时,怎么办
延迟是跟网络有关系的,
HANDLER.POST没有大多关联。
我用的时候也出现同样的问题
换网络就原满解决了
5. android 开发中如何实现让程序执行一条语句后延时一段时间后再执行下面的语句
你这方法完全是利用了单片机处理速度慢才会有伪延时效果,实际上那时机器正在运算,放在好点的机器上运算速度快了当然就没延时效果了。正统的延时还是要用到楼上说的线程,安卓还有一个timer类也可以用于定时。
6. Android中的线程池
线程池的好处
1、重用线程池中的线程,避免线程的创建与销毁带来的性能开销
2、能有效控制线程池的最大并发数,避免大量线程因抢占资源而导致的阻塞
3、能对线程进行简单的管理,提供定时或者指定间隔时间、循环执行等操作
线程池的概率来自于java的Executor接口,实现类是ThreadPoolExecutor, 它提供一系列的参数来配置线程池,以此构建不同的线程池。Android的线程池分4类,都是通过Executors所提供的工厂方法来得到。
ThreadPoolExecutor有四个构造函数,下面这个是最常用的
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnnable> workQueue, ThreadFactory threadFactory)
corePoolSize
线程池中的核心线程数,默认情况下核心线程会在线程池中一直存活,即使他们处于闲置状态。如果设置ThreadPoolExecutor 中的allowCoreThreadTimeOut = true, 核心线程在等待新任务到来时有超时机制,时间超过keepAliveTime所指定的时间后,核心线程会终止。
maximumPoolSize
最大线程数
keepAliveTime
非核心线程闲置的超时时间,超过这个时间,非核心线程会被回收。核心线程则要看allowCoreThreadTimeOut属性的值。
unit
时间单位
workQueue
线程池中的工作队列
threadFactory
线程工厂,为线程池提供创建新线程的功能。
举个例子,我们常用的okhttp内部也是使用了线程池,它的ThreadPoolExecutor主要是定义在Dispatcher类里面。 使用的是CachedThreadPool。
executorService = ThreadPoolExecutor(0, Int.MAX_VALUE, 60, TimeUnit.SECONDS, SynchronousQueue(), ThreadFactory("okhttp Dispatcher", false))
1、FixedThreadPool
通过Executors的newFixedThreadPool()创建,这是一个线程数量固定的线程池,里面所有的线程都是核心线程。
public static ExecutorService newFixedThreadPool(int nThreads){
return new ThreadPoolExecutor(nThreads, nThreads, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())
}
2、CachedThreadPool
通过Executors的newCacheThreadPool()创建,这是一个线程数量不定的线程池,里面所有的线程都是非核心线程。最大线程数是无限大,当线程池中的线程都处于活动状态时,新的task会创建新的线程来处理,否则就使用空闲的线程处理,所有的线程都是60s的超时时间,超时后会自动回收。
public static ExecutorService newFixedThreadPool(){
return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>())
}
3、ScheledThreadPool
通过Executors的newScheledThreadPool()创建, 核心线程固定,非核心线程无限大,当非核心线程空闲时,会立即被回收。适合做定时任务或者固定周期的重复任务。
public static ExecutorService newScheledThreadPool(int corePoolSize){
return new ThreadPoolExecutor(corePoolSize, Integer.MAX_VALUE, 0, TimeUnit.SECONDS, new DelayedWorkQueue())
}
4、SingleThreadExcecutor
通过Executors的newSingleThreadPool()创建,内部只有一个核心线程。
public static ExecutorService newFixedThreadPool(){
return new ThreadPoolExecutor(1, 1, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())
}
课外知识:LinkedBlockingQueue
LinkedBlockingQueue是由链表组成的阻塞队列,内部head 指向队列第一个元素,last指向最后一个元素。入队和出队都会加锁阻塞,都是使用了不同的锁。
DelayedWorkQueue
延时队列,队内元素必须是Delayed的实现类。对内元素会按照Delayed时间进行排序,对内元素只有在delayed时间过期了才能出队。
入队的时候不阻塞队列,出队的时候,如果队列为空或者队列里所有元素都等待时间都没有到期,则该线程进入阻塞状态。
7. android怎么让一个方法延时几秒
开启新线程
new Thread(new Runnable(){
public void run(){
Thread.sleep(XXXX);
handler.sendMessage(); //告诉主线程执行任务
}
}).start
8. 能主动让android主线程等待1s吗
对于Android apk的主线程,原则上是不能等的,虽然确实可以堵塞主线程1s。让主线程等待1s,就意味着程序无响应1s, 无响应时间过长,系统是会弹对话框来杀掉程序的。
9. android 开发中如何实现让程序执行一条语句后延时一段时间后再执行下面的语句
延时操作,可以用下列方案:
方案1:线程阻断
try {
Thread.currentThread().sleep(2000);//阻断2秒
} catch (InterruptedException e) {
e.printStackTrace();
}
方案2:使用Handler的postDelayed延迟操作。
mHandler .postDelayed(mRunnable, 3000); // 在Handler中执行子线程并延迟3s。
private Runnable mRunnable = new Runnable() {
@Override
public void run() {
mHandler.sendEmptyMessage(1);
}
};
Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
//3s后执行代码
}
}。
10. android中开线程延时问题
我想做到的效果是屏幕中画一个圆,然后圆会慢慢变小,当半径变成1时停止变小。然后每触摸一次屏幕圆半径会增大,直到半径到100停止。我把这两个写在了两个线程里,但是目前运行下来触摸屏放大圆可以,但是圆自己慢慢变小却不行。
MainActivity.java 重要 代码
public class MainActivity extends Activity{
private Thread thread1;
private Thread thread2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final FrameLayout frame=new FrameLayout(this);
setContentView(frame);
frame.findViewById(R.id.framelayout1);
final MyView view=new MyView(this);
thread1=new Thread(new Runnable(){
@Override
public void run(){
view.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v,MotionEvent event){
++view.r;
view.invalidate();
return true;
}
});
}
});
thread2=new Thread(new Runnable(){
@Override
public void run(){
--view.r;
view.invalidate();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
thread1.start();
thread2.start();
frame.addView(view);
if (view.r==1)
{
thread2.interrupt();
}
if (view.r==100){
thread1.interrupt();
}
}
}
class MyView extends View{
int r=10,x,y;
public MyView(Context context){
super(context);
x=context.getResources().getDisplayMetrics().widthPixels/2;
y=context.getResources().getDisplayMetrics().heightPixels/2;
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
canvas.drawColor(Color.WHITE);
Paint paint=new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(3);
paint.setStyle(Style.STROKE);
paint.setColor(Color.BLUE);
canvas.drawCircle(x,y,r,paint);
}
}