在 java 中停止异步任务的 onPostExecute

Stop the onPostExecute of an Async Task in java

我有以下代码。我的问题是,我无法将 JSON.execute() 转换为 stop/cancel。我花了很多时间寻找可能的答案,但我没能找到任何真正有效的答案(例如 JSON.cancel(true))。一旦我打开 trackerswitch,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");
                }
            }
        });

    }

}

这就是网络上所说的class:

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

    }
}

感谢您的帮助!

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

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

中使用匿名 class

This documentation 页面更清楚地说明了此事。 另请参阅 this page,了解在 AsyncTask 上调用 cancel(true) 时发生的情况。