当前位置:首页 » 安卓系统 » android线程休眠

android线程休眠

发布时间: 2022-07-04 19:22:51

❶ android 子线程访问网络超时怎么办

Android开发中经常需要调用线程访问网络,而手机的网络信号经常断断续续,容易出现网络超时的情况,这种情况下后台线程往往得不到关闭,浪费系统资源。
在下面的例子中使用了java 中的Timer类,对线程进行了约束,如果线程在一定时间内为响应则终止该线程。
import java.util.Timer;
import java.util.TimerTask;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.app.ProgressDialog;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {
private static final int TIME_OUT = 0;
private static final int SUCCESS = 1;
// 超时的时限为5秒
private static final int TIME_LIMIT = 5000;
ProgressDialog proDialog;
Timer timer;
Thread thread;
Button btn1, btn2;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
// 测试未超时的线程,为btn1绑定事件
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
proDialog = ProgressDialog.show(MainActivity.this, "提示",
"线程运行中");
// 匿名内部线程
thread = new Thread() {
@Override
public void run() {
while (true) {
try {
//线程休眠时间,超时
sleep(10000);
} catch (InterruptedException e) {
break;
}
}

}
};
thread.start();
// 设定定时器
timer = new Timer();
timer.schele(new TimerTask() {
@Override
public void run() {
sendTimeOutMsg();
}
}, TIME_LIMIT);

}
});
// 测试超时的线程,为btn2绑定事件
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {

proDialog = ProgressDialog.show(MainActivity.this, "提示",
"线程运行中");
// 匿名内部线程
thread = new Thread() {
public void run() {
try {
// 线程休眠时间,未超时
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Message msgSuc = new Message();
msgSuc.what = SUCCESS;
myHandler.sendMessage(msgSuc);
}
};
thread.start();
// 设定定时器
timer = new Timer();
timer.schele(new TimerTask() {
@Override
public void run() {
sendTimeOutMsg();
}
}, TIME_LIMIT);
}
});
}
// 接收消息的Handler
final Handler myHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case TIME_OUT:
//打断线程
thread.interrupt();
proDialog.dismiss();
Toast.makeText(MainActivity.this, "线程超时", Toast.LENGTH_SHORT)
.show();
break;
case SUCCESS:
//取消定时器
timer.cancel();
proDialog.dismiss();
Toast.makeText(MainActivity.this, "线程运行完成", Toast.LENGTH_SHORT)
.show();
break;
default:
break;
}
};
};
//向handler发送超时信息
private void sendTimeOutMsg() {
Message timeOutMsg = new Message();
timeOutMsg.what = TIME_OUT;
myHandler.sendMessage(timeOutMsg);
}

}

❷ android中怎么让线程长时间休眠线程休眠最长的安全时间是多少

设定一个Timer对象,时间到后触发事件再给handler发消息处理就行,处理完重置timer的时间进入下一个循环即可。随便用wait之类的土办法的话很容易被系统判定为进程挂死然后被kill掉的。

❸ android系统睡眠状态如何唤醒线程和广播

不能!
(不能手动唤醒,因为肯定需要点亮屏幕(手动点亮屏幕),所以并不是真睡眠状态)。
只能提前设置,比如闹钟,具体到“广播”即收音机,那么只建议使用第三方程序,如“蜻蜓FM”,就像闹钟可以定时自动开启。

如果是自己造,相当于重新编个程序出来,需要掌握大量专业性的东西,得不偿失

❹ 如何让android系统禁止休眠

在开发Android程序时,有时候在程序运行的时候,不能让系统休眠,否则有一些运行会停止,因此我们需要设置禁止休眠,有两种方式:一种是添加权限,别一种是代码中设置,建议使用第一种方式,这样,在安装程序的时候会进行提醒:
第一种方式:
在Manifest.xml文件里面用user-permission声明
名称为:android.permission.WAKE_LOCK

第二种方式:
getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
把这段代码加在setContentView(R.layout.main)之前即可

❺ java代码怎么控制android休眠和唤醒

唤醒:android.intent.action.SCREEN_ON (代码)

休眠:android.intent.action.SCREEN_OFF (代码)

android系统一段时间没有操作,

屏幕(screen)将从高亮(bright)变为暗淡(dim),如果再过段时间还是没有操作,屏幕(screen)从暗淡(dim)变为关闭(off).这时,系统将进入休眠.

而对于某些需要保持系统唤醒甚至屏幕唤醒的应用(比如视频播放器和音乐播放器)来说,就必须要有一个机制,使得系统不进入休眠状态,设置保持屏幕亮屏状态.

wakelock即用来实现以上目的

接下来对每一个模块具体分析:


powermanager

对应文件是android/frameworks/base/core/java/android/os/PowerManager.java


在Android中应用程序并不是直接同PowerManagerService交互的,而是通过PowerManager间接地与PowerManagerService打交道。

此文件定义了一个powermanager类.

主要实现了

1,wakelock的申请与释放

public WakeLock newWakeLock(int flags, String tag)

2,系统延时进入休眠

public void userActivity(long when, boolean noChangeLights)

3,系统强制休眠

public void goToSleep(long time)

4,屏幕亮度设置

public void setBacklightBrightness(int brightness)

5,屏幕状态查询

public boolean isScreenOn()

6,系统重启

public void reboot(String reason)


细节

wakelock的申请与释放

{@samplecode

*PowerManager pm = (PowerManager)mContext.getSystemService(

* Context.POWER_SERVICE);

*PowerManager.WakeLock wl = pm.newWakeLock(

* PowerManager.SCREEN_DIM_WAKE_LOCK

* | PowerManager.ON_AFTER_RELEASE,

* TAG);

*wl.acquire();

* // ...

*wl.release();

一共有如下几个flag来进行不一样的唤醒方式.可以根据需要设置

Flag Value CPU Screen Keyboard

PARTIAL_WAKE_LOCK On* can-off Off

SCREEN_DIM_WAKE_LOCK On Dim Off

PROXIMITY_SCREEN_OFF_WAKE_LOCK on 距离传感器时关闭 off

SCREEN_BRIGHT_WAKE_LOCK On Bright Off

FULL_WAKE_LOCK On Bright Bright


ACQUIRE_CAUSES_WAKEUP 确保wakelock,主要用于视频播放器

ON_AFTER_RELEASE = 0x20000000 release后倒计时,关闭屏幕

...


userActivity的作用:

使系统从其他状态进入全部打开状态,比如从暗屏(dim)切换到亮屏,并重置倒计时计数器

❻ android系统休眠关闭了哪些功能

Android的几种不同的休眠模式
如果不进行特别的设置,Android会在一定时间后屏幕变暗,在屏幕变暗后一定时间内,约几分钟,CPU也会休眠,大多数的程序都会停止运行,从而节省电量。但你可以在代码中通过对Powmanager API的调用来设置不同的休眠模式。
Flag Value CPU Screen Keyboard
PARTIAL_WAKE_LOCK On* Off Off
SCREEN_DIM_WAKE_LOCK On Dim Off
SCREEN_BRIGHT_WAKE_LOCK On Bright Off
FULL_WAKE_LOCK On Bright Bright
如上表,最高等级的休眠是屏幕,键盘等,cpu都全部休眠。可以设置不同的模式,让其产生不同的休眠,比如让cpu保持运行。

❼ android 子线程长时间休眠会不会被杀死

会, android 应用程序层使用java 语言, java 有gc 自动回收机制, 长时间没有使用的资源会自动回收,所以说一般情况下java 不用开发者自己去释放内存。

❽ android中的线程池 怎么用

Java的线程池对Android也是适用的
线程池的作用:
线程池作用就是限制系统中执行线程的数量。
根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。用线程池控制线程数量,其他线程
排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程
池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
为什么要用线程池:
1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。
2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。

Java通过Executors提供四种线程池,分别为:
newCachedThreadPool创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。

1.newCachedThreadPool

/**
* 可以缓存线程池
*/
public static void Function1() {
ExecutorService executorService = Executors.newCachedThreadPool();
for (int i = 0; i < 50; i++) {
final int index = i;
try {
Thread.sleep(100); // 休眠时间越短创建的线程数越多
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
executorService.execute(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("active count = " + Thread.activeCount()
+ " index = " + index);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}

打印结果
active count = 2 index = 0
active count = 3 index = 1
active count = 4 index = 2
active count = 5 index = 3
active count = 6 index = 4
active count = 7 index = 5
active count = 8 index = 6
active count = 9 index = 7
active count = 10 index = 8
active count = 11 index = 9
active count = 11 index = 10
active count = 11 index = 11
active count = 11 index = 12
active count = 11 index = 13
active count = 11 index = 14
active count = 11 index = 15
active count = 11 index = 16
active count = 11 index = 17
active count = 11 index = 18
active count = 11 index = 19
active count = 11 index = 20
active count = 11 index = 21
active count = 11 index = 22
active count = 11 index = 23
active count = 11 index = 24
active count = 11 index = 25
active count = 11 index = 26
active count = 11 index = 27
active count = 11 index = 28
active count = 11 index = 29
active count = 11 index = 30
active count = 11 index = 31
active count = 11 index = 32
active count = 11 index = 33
active count = 11 index = 34
active count = 11 index = 35
active count = 11 index = 36
active count = 11 index = 37
active count = 11 index = 38
active count = 11 index = 39
active count = 11 index = 40
active count = 11 index = 41
active count = 11 index = 42
active count = 11 index = 43
active count = 11 index = 44
active count = 11 index = 45
active count = 11 index = 46
active count = 11 index = 47
active count = 11 index = 48
active count = 10 index = 49
从打印消息来看开始线程数在增加,后来稳定,可以修改休眠时间,休眠时间越短创建的线程数就越多,因为前面的还没执行完,线程池中没有可以执行的就需要创建;如果把休眠时间加大,创建的线程数就会少

2.newFixedThreadPool 根据传入的参数创建线程数目
/**
* 定长线程池
*/
public static void Function2() {
ExecutorService executorService = Executors.newFixedThreadPool(3);
for (int i = 0; i < 30; i++) {
final int index = i;
executorService.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println("index = " + index
+ " thread count = " + Thread.activeCount());
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}

3.newScheledThreadPool
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

/**
* 定长线程池,可做延时
*/
public static void Function3() {
ScheledExecutorService executorService = Executors
.newScheledThreadPool(5);
executorService.schele(new Runnable() {

@Override
public void run() {
System.out.println("delay 3 seconds" + " thread count = "
+ Thread.activeCount());
}
}, 3, TimeUnit.SECONDS);
}

/**
* 定期执行,可以用来做定时器
*/
public static void Function4() {
ScheledExecutorService executorService = Executors
.newScheledThreadPool(3);
executorService.scheleAtFixedRate(new Runnable() {
@Override
public void run() {
System.out
.println("delay 1 seconds, and excute every 3 seconds"
+ " thread count = " + Thread.activeCount());
}
}, 1, 3, TimeUnit.SECONDS);
}
打印结果
?

1
2
3
4
5
6
7
8
9

delay 1 seconds, and excute every 3 seconds thread count = 2
delay 1 seconds, and excute every 3 seconds thread count = 3
delay 1 seconds, and excute every 3 seconds thread count = 4
delay 1 seconds, and excute every 3 seconds thread count = 4
delay 1 seconds, and excute every 3 seconds thread count = 4
delay 1 seconds, and excute every 3 seconds thread count = 4
delay 1 seconds, and excute every 3 seconds thread count = 4
delay 1 seconds, and excute every 3 seconds thread count = 4
delay 1 seconds, and excute every 3 seconds thread count = 4

4.newSingleThreadExecutor这个最简单
?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

/**
* 单例线程
*/
public static void Function5() {
ExecutorService singleThreadExecutor = Executors
.newSingleThreadExecutor();
for (int i = 0; i < 5; i++) {
final int index = i;
singleThreadExecutor.execute(new Runnable() {

@Override
public void run() {
try {
System.out.println("index = " + index
+ " thread count = " + Thread.activeCount());
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
}

打印结果:
?

1
2
3
4
5

index = 0 thread count = 2
index = 1 thread count = 2
index = 2 thread count = 2
index = 3 thread count = 2
index = 4 thread count = 2

❾ 如何控制android 设备休眠 ,禁用休眠,设置等待时间

到设置~显示~休眠下选择合适的时间甚至取消休眠。

❿ android 如何让手机进入休眠状态,又如何唤

1.WakeLock主要代码如下:

PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE);
wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, this.getClass().getName());//持有唤醒锁
wakeLock.setReferenceCounted(false);
wakeLock.acquire(30*1000);//30s亮屏
wakeLock.release();//释放锁,灭屏

2.FLAG_KEEP_SCREEN_ON代码如下
可使用 FLAG_KEEP_SCREEN_ON 替换WakeLock的方式.
this.getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//亮屏
this.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);//灭屏

热点内容
scratch少儿编程课程 发布:2025-04-16 17:11:44 浏览:629
荣耀x10从哪里设置密码 发布:2025-04-16 17:11:43 浏览:357
java从入门到精通视频 发布:2025-04-16 17:11:43 浏览:76
php微信接口教程 发布:2025-04-16 17:07:30 浏览:300
android实现阴影 发布:2025-04-16 16:50:08 浏览:788
粉笔直播课缓存 发布:2025-04-16 16:31:21 浏览:338
机顶盒都有什么配置 发布:2025-04-16 16:24:37 浏览:204
编写手游反编译都需要学习什么 发布:2025-04-16 16:19:36 浏览:801
proteus编译文件位置 发布:2025-04-16 16:18:44 浏览:357
土压缩的本质 发布:2025-04-16 16:13:21 浏览:583