创建Activity时,AsyncTask不会从start开始运行

时间:2016-05-17 07:32:01

标签: android android-asynctask

我遇到了一个问题:我创建了两个活动 一个是主要的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);

        }


    }

}

5 个答案:

答案 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();
    }
}
相关问题