我是Android新手,现在正在使用AsyncTask
处理计数器事务。
所以问题是我有一个按钮并且有一个按钮OnClickListener
。
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
boolean check;
check=check_button_status();
if(check==true){
rec_forward_task.execute();
}
else
{
rec_forward_task.cancel();
}
}
});
所以这里rec_forward_task
是扩展AsyncTask
的类。 AsyncTask
课程就在这里。
//
private class CounterForwardTask extends AsyncTask<Void, Integer, Integer>
{
TextView record_counter_display;
int rec_counter,count;
int last_value;
@Override
protected void onPreExecute() {
// TODO Auto-generated method stub
record_counter_display=(TextView) findViewById(R.id.rec_voice_counter);
rec_counter=0;
record_counter_display.setText(String.valueOf(rec_counter));
count=0;
}
public void cancel() {
// TODO Auto-generated method stub
onCancelled();
}
@Override
protected Integer doInBackground(Void... params) {
// TODO Auto-generated method stub
while(rec_status)
{
publishProgress(count);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
last_value=count;
count=count+1;
}
return 1;
}
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
record_counter_display.setText(String.valueOf(0));
}
@Override
protected void onProgressUpdate(Integer... values) {
// TODO Auto-generated method stub
runOnUiThread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
record_counter_display.setText(String.valueOf(count));
}
});
}
@Override
protected void onPostExecute(Integer result) {
// TODO Auto-generated method stub
record_counter_display.setText(String.valueOf(last_value));
}
}
我只是在oncreate方法中为该类创建对象,所以现在的问题是。
当用户第一次按下计数器正在启动并在textview中显示并再次按下同一个按钮时,由于oncancel方法被调用,计数器进度停止。但是如果用户再次按下同一个按钮app强制关闭和异常你无法启动已经启动的任务。那么执行此类操作的方式是什么。感谢您的回复。
答案 0 :(得分:4)
if(check==true){
rec_forward_task = new CounterForwardTask();
rec_forward_task.execute();
}
else
{
rec_forward_task.cancel();
}
而不是在onCreate中实例化AsyncTask,而不是在需要启动它时实例化它。希望这可以帮助。
答案 1 :(得分:2)
您必须创建一个新的AsyncTask对象。 AsyncTasks只能运行一次。
答案 2 :(得分:0)
异步任务只能运行一次。但是您可以通过创建asynctask类的新实例来运行它。请参阅Passionate Androiden的答案
线程规则
此类必须遵循一些线程规则才能正常工作:
必须在UI线程上加载AsyncTask类。这是从JELLY_BEAN开始自动完成的。
必须在UI线程上创建任务实例。 必须在UI线程上调用execute(Params ...)。 不要手动调用onPreExecute(),onPostExecute(Result),doInBackground(Params ...),onProgressUpdate(Progress ...)。
该任务只能执行一次(如果尝试第二次执行,则会抛出异常。)
中查找更多内容