【问题标题】:Run a AsyncTask every 10 seconds until cancelled每 10 秒运行一次 AsyncTask 直到取消
【发布时间】:2013-08-12 13:22:40
【问题描述】:

在我的应用程序中,我有一个按钮,它启动一个 AsyncTask,它下载带有谷歌地图坐标的数据,然后在地图上的以下坐标处绘制一个标记。我想每 10 秒运行一次,直到用户再次按下按钮。

这是我的处理程序代码:

    class handleMap{
    Handler mHandler = new Handler();

    Runnable mTask = new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            while(btnRefreshPressed == false){

                try{
                    new getGoogleMap().execute();
                    mHandler.postDelayed(mTask, INTERVAL);
                    Thread.sleep(INTERVAL);
                } catch(Exception e){
                    System.out.println(e.toString());
                }
            }
        }
    };

    public void starReapetingClass (){
        hMap.starReapetingClass();
    }
    public void stopDoing(){
        mHandler.stopDoing();
    }
}

并在调用它的菜单按钮中:

    case R.id.id_Refresh:
        handleMap hMap = new handleMap();
        if(btnRefreshPressed == true){
            menuItem = item;
            menuItem.setActionView(R.layout.progressbar);
            menuItem.expandActionView();


            fRun += 1;
            btnRefreshPressed = false;
            hMap.run();
        }else if(btnRefreshPressed == false){
            if(fRun > 0){
                menuItem.collapseActionView();
                menuItem.setActionView(null);
            }
            btnRefreshPressed = true;
            hMap.stopHandler();
        }

这当前会导致应用程序冻结,系统会输出一个对话框,说明应用程序没有响应,并询问我是要关闭还是等待。

我怀疑它与 while 语句有关,但我在 logcat 中没有收到任何错误。 提前致谢。

【问题讨论】:

    标签: android android-asynctask handler


    【解决方案1】:

    只需使用:

    private int mSampleDurationTime = 10000;
    private boolean continueToRun = true;
    
    mHandler.postDelayed(mRunnable, mSampleDurationTime);
    

    mRunnable 是你的任务:

    private final Runnable mRunnable = new Runnable() {
    
     //...
    public void run() {
    
       ...
    
       if(continueToRun == true){
        mHandler.postDelayed(mRunnable, mSampleDurationTime);
       }
    
     }
        ...
    };
    

    第一次调用postDelayed 并调用new Runnable()。之后,如果你想继续, 将相同的方法调用到run()

    【讨论】:

    • 假设你有一个按钮可以运行所有的东西,所以把它放到onButtonClick()
    • 我用我如何尝试实施您的答案更新了我的问题,它有效,我可以看到我如何获取数据,但应用程序仍然冻结。
    • 你有 UI 线程(主)和逻辑线程。如果要更新 GUI 以防止冻结,请使用处理程序。
    猜你喜欢
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多