【问题标题】:Errors canceling AsyncTask "Cannot make a static reference to the non-static method cancel(boolean) from the type AsyncTask<Void,Integer,Void>"取消 AsyncTask 时出错“无法从 AsyncTask<Void,Integer,Void> 类型对非静态方法 cancel(boolean) 进行静态引用”
【发布时间】:2014-08-23 16:34:07
【问题描述】:

我试图做到这一点,以便当用户按下按钮时,它会取消异步任务,然后完成活动,但我不断收到“MyAsyncTask.cancel(true);”错误如果您需要其他信息,请告诉我。

这是我得到的,

class MyAsyncTask extends AsyncTask<Void, Integer, Void>{
                boolean DoingSomething;
                int progress_status;

                @Override
                protected void onPreExecute() {

                    super.onPreExecute();
                    Log.v("UpGradeRep", "started");
                     DoingSomething = true;
                     UpGradeRep.setVisibility(View.GONE);
                     UpGradeRepDis.setVisibility(View.GONE);
                    Toast.makeText(MainActivity.this,
                             "started", Toast.LENGTH_SHORT).show();


                    // progress_status  =   0;  
                }

                @Override
                protected Void doInBackground(Void... params) {

                     while (!isCancelled()) {

                         while(DoUpCount==true){

                        progress_status += 1;
                           publishProgress(progress_status);
                        SystemClock.sleep(200);

                                if(isCancelled()){
                                    break;
                                }
                        }

                   }  
                    return null;
                }
                int UpGradRepcounter = 0;
                @Override
                protected void onProgressUpdate(Integer... values) {
                    super.onProgressUpdate(values);


                    UpGradRepcounter++;

                    DevUpCountDis.setText(" "+UpGradRepcounter);
                    Money = Money +inc;
                    MoneyDis.setText("$"+Money);


                }

                @Override
                protected void onCancelled() {

                    Toast.makeText(getApplicationContext(), "Canceled", Toast.LENGTH_SHORT);

                }

                @Override
                protected void onPostExecute(Void result) {
                    super.onPostExecute(result);



                    DoUpCount=false;
                    DoingSomething = false;
                    Log.v("UpGradeRep", "Done");
                }

            }

当我试图关闭它时,我会这样做

Statistics.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            MyAsyncTask.cancel(true);
          //^^^^Right here is where it tells me "Cannot make a static reference to the non-static method cancel(boolean) from the type AsyncTask<Void,Integer,Void>"
            Intent GoToStatistics = new Intent(getApplicationContext(),statistics.class);
            GoToStatistics.putExtra("LittleHelper", LittleHelper);
            startActivity(GoToStatistics);

            finish();
            }
        });

这就是我设置的代码来做我想做的事,而且效果很好,但是当我离开它时,我的 Logcat 中会出现丢帧警告,所以我猜测我没有正确关闭它

我是这样开始的 所以当用户按下按钮时,它就会启动它

UpGradeRep.setOnClickListener(new View.OnClickListener() {

        @SuppressWarnings("unchecked")
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            if (Money>=upGM2) {
                LittleHelper=true;
                DoUpCount=true;
                Log.v("DoUpCount"," "+DoUpCount);
                (new MyAsyncTask()).execute();
            }else{
                Error.setText("you need more money.");
            }

        }
    });

【问题讨论】:

  • 你是如何开始你的 AsyncTask 的?

标签: java android asynchronous android-asynctask


【解决方案1】:

您正试图在静态上下文 (onClick()) 事件中通过非静态对象调用方法。基本上,该错误告诉您的是,您必须将 AsyncTask 对象设为静态,以便能够在其上调用 cancel() 方法。

这与将AsyncTask 声明为static 一样“简单”,但这可能会在AsyncTask 对象上产生一些其他编译错误,并且您必须非常彻底以避免可能的内存泄漏。

【讨论】:

    【解决方案2】:

    cancel(boolean mayInterruptIfRunning) 方法(在AsyncTask 类中)不是static 方法,您使用类名调用它(调用静态方法的方式)。

    你应该使用MyAsyncTask的实例来调用(this):

    this.cancel(true);
    

    【讨论】:

    • cancel(boolean)AsyncTask,AFAIK 的一种方法。
    猜你喜欢
    • 2013-01-15
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多