Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 每10秒运行一次异步任务,直到取消_Android_Android Asynctask_Handler - Fatal编程技术网

Android 每10秒运行一次异步任务,直到取消

Android 每10秒运行一次异步任务,直到取消,android,android-asynctask,handler,Android,Android Asynctask,Handler,在我的应用程序中,我有一个按钮,它启动一个异步任务,下载带有谷歌地图坐标的数据,然后在地图上以下坐标处绘制一个标记。我想每10秒运行一次,直到用户再次按下按钮 以下是我的处理程序代码: class handleMap{ Handler mHandler = new Handler(); Runnable mTask = new Runnable() { @Override public void run() {

在我的应用程序中,我有一个按钮,它启动一个异步任务,下载带有谷歌地图坐标的数据,然后在地图上以下坐标处绘制一个标记。我想每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中没有发现任何错误。 提前感谢。

只需使用:

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
并调用
newrunnable()
。之后,如果你想继续,
将相同的方法调用到
run()

假设您有一个运行所有内容的按钮,因此将其放入
onButtonClick()
我更新了我的问题,说明了我如何尝试实现您的答案,它是有效的,我可以看到我如何获取数据,但应用程序仍然冻结。您有UI线程(主线程)和逻辑线程。若要更新GUI以防止冻结,请使用处理程序。