【问题标题】:Stop the onPostExecute of an Async Task in java在java中停止异步任务的onPostExecute
【发布时间】:2020-10-10 04:01:28
【问题描述】:

我有以下代码。我的问题是,我无法让 JSON.execute() 停止/取消。我花了很多时间寻找可能的答案,但我找不到任何真正有效的东西(例如 JSON.cancel(true))。一旦我打开跟踪器开关,AsnycTask 就会像预期的那样每 3 秒开始运行一次。有没有办法在 trackerswitch 关闭后轻松停止 AsyncTask 的执行?

    private boolean tracking = false;
    private Switch trackerswitch;
    private final Timer timer= new Timer();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.table_layout);
        final Handler handler=new Handler();
        final int delay = 4000;

        trackerswitch=findViewById(R.id.trackerswitch);
        trackerswitch.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                NetworkAccess JSON = new NetworkAccess();
                if(trackerswitch.isChecked()){
                    trackerswitch.setText("Tracking...");
                    tracking=true;
                    handler.postDelayed(new Runnable() {
                        @Override
                        public void run() {
                            NetworkAccess JSON = new NetworkAccess();
                            JSON.execute();
                            handler.postDelayed(this, delay);
                        }
                    },delay);
                }
                else{
                    tracking=false;
                    trackerswitch.setText("Start Tracking");
                }
            }
        });

    }

}

这就是网络类中所说的:

public class NetworkAccess extends AsyncTask<Void, Void, Void> {
    public ArrayList<String> alldata = new ArrayList<>();
    public ArrayList<String> locationlist = new ArrayList<>();
    int stride;
    String data;

    @Override
    protected Void doInBackground(Void... voids) {//4B4ADC

                SOME CODE WHICH ISN'T IMPORTANT FOR MY PROBLEM

                alldata.addAll(elementlist);
                locationlist.addAll(loctrack);

            }
        }
        catch(IOException | JSONException e){
            MainActivity.field1.setText(e.getClass().getCanonicalName());
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
        super.onPostExecute(aVoid);
        MainActivity.field1.setText(String.format("%20s %20s", alldata.get(0), alldata.get(1)));
         COUPLE MORE OF THESE SETTEXT COMMANDS TO FILL A TABLE WITH DATA

    }
}

感谢您的帮助!

【问题讨论】:

    标签: java android android-studio android-asynctask cancellation


    【解决方案1】:

    handler.postDelayed() 将您提供的Runnable 的对象添加到消息队列中,以指定的时间间隔运行。您需要从消息队列中删除所有排队的对象才能取消执行。调用JSON.cancel(true) 不会影响已添加到队列中的其他对象。

    您必须保留对 Runnable 实现的引用,然后调用 handler.removeCallbacks(r) 以防止进一步执行。而不是在handler.postDelayed() 中使用匿名类。

    This documentation 页面对此事有更多的了解。 另请参阅 this page 了解在 AsyncTask 上调用 cancel(true) 时会发生什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-06
      • 1970-01-01
      • 2016-07-16
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多