Android 为什么异步任务不停止?

Android 为什么异步任务不停止?,android,Android,嗨,谢谢你的关注 我有下面的代码,它 按下按钮时启动异步任务 及 应在释放按钮时停止AsyncTask。 但这不会发生 AsyncTask一直持续到其自然结束,即达到MAXX值 请问我做错了什么 将此添加到while循环: if (isCancelled()) break; 更多信息:查看 还定义了不会取消doInBackGround。因此,您应该检查循环中的线程是否被取消,并按照文档中的示例所述中断/保留它 所以你的代码应该像这样 @Override prot

嗨,谢谢你的关注

我有下面的代码,它

按下按钮时启动异步任务 及

应在释放按钮时停止AsyncTask。 但这不会发生

AsyncTask一直持续到其自然结束,即达到MAXX值

请问我做错了什么


将此添加到while循环:

if (isCancelled()) break;
更多信息:

查看

还定义了不会取消doInBackGround。因此,您应该检查循环中的线程是否被取消,并按照文档中的示例所述中断/保留它

所以你的代码应该像这样

        @Override
        protected Void doInBackground(Void... unused) {
            while (x < MAXX) {
                if (x < MAXX)
                    x++;
                publishProgress();
                if (isCancelled()) break;  //Add this line!
                SystemClock.sleep(40);
            }
            return (null);
        }
对不起,我还要说几句话:

类的名称应以大写字母开头。 当你想增加x时,为什么不使用for循环呢 变量应以小写字母开头 因此,通常您的代码应该如下所示:

class Right extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... unused) {
        for(int x = 0; x < MAXX; x++){

            publishProgress();
            if (isCancelled()) break;  //Add this line!            
            SystemClock.sleep(40);
        }
        return (null);
    }

    @Override
    protected void onProgressUpdate(Void... unused) {
        horizontal.scrollTo(x, 0);
        Log.e("x", Integer.toString(x));
    }

    @Override
    protected void onPostExecute(Void unused) {

    }
}


Right righttask;  //make it global!
left.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch (event.getAction()) {

        case MotionEvent.ACTION_DOWN:
            righttask = new Right();
            righttask.execute();
            break;
        case MotionEvent.ACTION_UP:
            righttask.cancel(true);
            Log.e("","SHOULD STOP ASYNCTASK!!!");
            break;
        }
        return false;
    }
});

我认为这篇文章可能有用,也许你的问题是一样的:

您好,我的办公桌刚刚离开,我的笔记本电脑上没有IDE,所以我只是想写一段代码,尝试使用Runnable而不是AsyncTask:

    //GLOABLS
boolean threadBool = false;
Handler handler;
    Thread thread;

onCreate(){
    handler = new Handler();


    left.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:

                threadBool = true;
                // handler.post(myRunabble);
                                    thread = newThread(myRunnable);
                                    thread.start();
                break;
            case MotionEvent.ACTION_UP:
                threadBool = false;
                break;
            }
            return false;
        }
    });
}

Runnable myRunnable = new Runnable() {
      @Override
      public void run() {
           for(int x = 0; x < MAXX; x++ ){
              handler.post(new Runnable(){
                  public void run() {
                     horizontal.scrollTo(x, 0);
              });
               if (threadBool == false){
                           threadBool = true;
                           break;
                       } 

               try{ Thrad.sleep(100); }catch(Exception e){} //catch the right one here
           }
      }
 };

如果您阅读了cancel的文档,您会发现它并没有达到您想要的效果。顺便说一句,我看不出if条件的意义。所以试着用thrad/runnableOH该死的去吧!你在每个TouchEvent都创建一个新的Asymnctask这是我考虑过的,让我检查一下,请为正确的AsyncTask定义一个全局变量,并在onCreate中对其进行初始化,或者像我更新的回答那样进行初始化。如果您只想在列表视图中滚动,您还应该检查SmoothScroll以查看以下内容:您可以编辑我的回答吗
    //GLOABLS
boolean threadBool = false;
Handler handler;
    Thread thread;

onCreate(){
    handler = new Handler();


    left.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:

                threadBool = true;
                // handler.post(myRunabble);
                                    thread = newThread(myRunnable);
                                    thread.start();
                break;
            case MotionEvent.ACTION_UP:
                threadBool = false;
                break;
            }
            return false;
        }
    });
}

Runnable myRunnable = new Runnable() {
      @Override
      public void run() {
           for(int x = 0; x < MAXX; x++ ){
              handler.post(new Runnable(){
                  public void run() {
                     horizontal.scrollTo(x, 0);
              });
               if (threadBool == false){
                           threadBool = true;
                           break;
                       } 

               try{ Thrad.sleep(100); }catch(Exception e){} //catch the right one here
           }
      }
 };