Android 最大时间异步任务
Android asynctask for max time
我正在尝试从物理设备读取数据。
为了获取数据,我使用异步任务来避免 UI 阻塞。
当我点击一个按钮时,我应该做两次(对于最小值和最大值):
等待 5 秒;
获取数据1秒。
所以代码写在按钮的OnClickListener中。
对于第一个任务,我使用此方法:
new android.os.CountDownTimer(5000, 1000) {
public void onTick(long millisUntilFinished) { }
public void onFinish() { }
}.start();
第二次我使用的是异步任务,在它的 doInBackground 方法中我有
while(booleanValueMax || booleanValueMin) {
//code
}
(booleanValueMax 和 booleanValueMin 是可变布尔值)。现在我使用定时器(在异步任务之外)将这两个设置为 false:
Timer min = new Timer();
min.schedule(new TimerTask() {
@Override
public void run() {
booleanValueMin = false;
}
}, 1000);
(最大值相同)
现在我想使用相同的异步任务来存储最大值和最小值。所以我知道我正在获取哪些数据来检查布尔值(在 doInBackground 方法中)。
if(booleanValueMax)
//store max
else
//store min
问题是这些变量总是错误的。我也不知道为什么。
除了使用 Timer、CountDownTimer 等之外,还有其他方法可以实现我的目标吗?我'
您没有显示启动异步任务的代码,但是:所有异步任务共享同一个线程池。在最简单的情况下,它只是一个线程。最有可能的是,您的 asynctask 在设置任何变量之前开始和完成。异步任务适用于不需要等待的长时间操作。如果您希望您的代码等待某个事件,最好使用 Thread
。 (好吧,有可能 post messages/runnables 到线程,参见 Looper
和 Handler
。)
只需制作两个单独的 asynchtask
并根据您的值调用它们,即
而(booleanValueMax || booleanValueMin){
//代码
}
这是一个例子:
private void executeBigTask(){
BigTask bigTask = new BigTask();
bigTask.execute();
// Check
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
@Override
public void run() {
if (bigTask.getStatus() == AsyncTask.Status.RUNNING){
bigTask.cancel(true);
}
}
}, 10000);
}
protected class BigTask extends AsyncTask<String, String, Integer> {
@Override
protected Integer doInBackground(String... params) {
/**
LONG TASK
*/
return 0;
}
@Override
protected void onCancelled() {
super.onCancelled();
Toast.makeText(MainActivity.this, getString(R.string.task_too_long), Toast.LENGTH_LONG).show();
}
}
我正在尝试从物理设备读取数据。 为了获取数据,我使用异步任务来避免 UI 阻塞。 当我点击一个按钮时,我应该做两次(对于最小值和最大值): 等待 5 秒; 获取数据1秒。 所以代码写在按钮的OnClickListener中。 对于第一个任务,我使用此方法:
new android.os.CountDownTimer(5000, 1000) {
public void onTick(long millisUntilFinished) { }
public void onFinish() { }
}.start();
第二次我使用的是异步任务,在它的 doInBackground 方法中我有
while(booleanValueMax || booleanValueMin) {
//code
}
(booleanValueMax 和 booleanValueMin 是可变布尔值)。现在我使用定时器(在异步任务之外)将这两个设置为 false:
Timer min = new Timer();
min.schedule(new TimerTask() {
@Override
public void run() {
booleanValueMin = false;
}
}, 1000);
(最大值相同)
现在我想使用相同的异步任务来存储最大值和最小值。所以我知道我正在获取哪些数据来检查布尔值(在 doInBackground 方法中)。
if(booleanValueMax)
//store max
else
//store min
问题是这些变量总是错误的。我也不知道为什么。
除了使用 Timer、CountDownTimer 等之外,还有其他方法可以实现我的目标吗?我'
您没有显示启动异步任务的代码,但是:所有异步任务共享同一个线程池。在最简单的情况下,它只是一个线程。最有可能的是,您的 asynctask 在设置任何变量之前开始和完成。异步任务适用于不需要等待的长时间操作。如果您希望您的代码等待某个事件,最好使用 Thread
。 (好吧,有可能 post messages/runnables 到线程,参见 Looper
和 Handler
。)
只需制作两个单独的 asynchtask
并根据您的值调用它们,即
而(booleanValueMax || booleanValueMin){
//代码
}
这是一个例子:
private void executeBigTask(){
BigTask bigTask = new BigTask();
bigTask.execute();
// Check
Handler handler = new Handler();
handler.postDelayed(new Runnable(){
@Override
public void run() {
if (bigTask.getStatus() == AsyncTask.Status.RUNNING){
bigTask.cancel(true);
}
}
}, 10000);
}
protected class BigTask extends AsyncTask<String, String, Integer> {
@Override
protected Integer doInBackground(String... params) {
/**
LONG TASK
*/
return 0;
}
@Override
protected void onCancelled() {
super.onCancelled();
Toast.makeText(MainActivity.this, getString(R.string.task_too_long), Toast.LENGTH_LONG).show();
}
}