我遇到了一个问题:我创建了两个活动
一个是主要的Activity,它有一个Button
当我单击此按钮时,第二个活动开始
第二个活动使用Asynctask
,其中一个数字从1增加到10,并在Textview
我面临的是,当Asynctask
尚未完成时单击后退按钮然后再次转到第二个活动时,Asynctask
不会立即从开始运行。
我知道因为在后台完成旧任务时它会再次启动新任务。有没有办法在销毁活动时解决这个问题,它还会破坏Asynctask
?
我的问题是video sample 主要活动代码:
public class MainActivity extends AppCompatActivity {
Button bt;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this,SecondAcitivity.class);
startActivity(i);
}
});
}
}
第二活动代码:
public class SecondAcitivity extends AppCompatActivity {
TextView t1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second_acitivity);
t1 = (TextView) findViewById(R.id.t1);
OurWork obj = new OurWork();
obj.execute();
}
class OurWork extends AsyncTask<Void, Integer, String> {
@Override
protected String doInBackground(Void... params) {
int i = 0;
while (i < 11) {
try {
Thread.sleep(700);
publishProgress(i);
i++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "Successfully Completed";
}
@Override
protected void onProgressUpdate(Integer... values) {
t1.setText(values[0] + "%");
}
@Override
protected void onPostExecute(String result) {
t1.setText(result);
}
}
}
答案 0 :(得分:0)
按后退按钮时,会调用onBackPressed callback
。所以你基本上可以试试这个:
@Override
public void onBackPressed() {
if (asyncFetch.getStatus() == AsyncTask.Status.RUNNING) {
asyncFetch.cancel(true);
}
finish();
}
答案 1 :(得分:0)
尝试使用:
private OurWork task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second_acitivity);
t1 = (TextView) findViewById(R.id.t1);
task = new OurWork();
task.execute();
}
@Override
public void onBackPressed() {
task.cancel(true);
super.onBackPressed();
}
答案 2 :(得分:0)
AsyncTask在托管它的活动的后台运行。如果调用OnPause或OnDestroy,则会销毁AsyncTask,因此要解决此问题,请重写OnResume并再次执行AsyncTask。
答案 3 :(得分:0)
您需要在后退时取消任务,并且需要在执行@Controller
public class ScheduledTaskController {
@Autowired
private TaskScheduler taskScheduler;
@Autowired
private ScheduledTask scheduledTask;
@RequestMapping(value = "/task/run", method = RequestMethod.GET)
public String runTask() {
// start to run task every 5 sec.
taskScheduler.schedule(scheduledTask, new CronTrigger("0/5 * * * * ?"));
// ok, redirect
return "redirect:/task";
}
}
时监控任务是否被取消。
1- override onbackpressed:
doInbackground()
2监视@Override
public void onBackPressed() {
obj.cancel(true); // where obj is the asyncTask refernce object name
super.onBackPressed();
}
isCanceled()
在while循环的下一次迭代中,在调用@Override
protected String doInBackground(Void... params) {
int i = 0;
while (i < 11 && !isCancelled()) { // added !isCancelled()
try {
Thread.sleep(700);
publishProgress(i);
i++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "Successfully Completed";
}
之后,循环将退出,cancel(true);
将返回。
答案 4 :(得分:0)
要取消asyncTask,即使在按下后退时它正在运行,请将其添加到onBackPressed:
public class SecondAcitivity extends AppCompatActivity {
TextView t1;
static OurWork obj;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second_acitivity);
t1 = (TextView) findViewById(R.id.t1);
obj = new OurWork();
obj.execute();
}
class OurWork extends AsyncTask<Void, Integer, String> {
@Override
protected String doInBackground(Void... params) {
int i = 0;
while (i < 11) {
try {
Thread.sleep(700);
publishProgress(i);
i++;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "Successfully Completed";
}
@Override
protected void onProgressUpdate(Integer... values) {
t1.setText(values[0] + "%");
}
@Override
protected void onPostExecute(String result) {
t1.setText(result);
}
}
//override onBackPressed and do this
@Override
public void onBackPressed() {
if (obj!=null && (obj.getStatus()== AsyncTask.Status.RUNNING ||
obj.getStatus()== AsyncTask.Status.PENDING ))
obj.cancel(true);
super.onBackPressed();
}
}