Остановить onPostExecute задачи Asyn c в java - PullRequest
1 голос
/ 19 июня 2020

У меня есть следующий код. Моя проблема в том, что я не могу заставить JSON .execute () остановить / отменить. Я потратил довольно много времени на поиск возможных ответов, но не смог найти ничего, что действительно работало (например, JSON .cancel (true)). Как только я включаю трекер, AsnycTask запускается каждые 3 секунды, как и положено. Есть ли способ легко остановить выполнение 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

    }
}

Спасибо за помогите!

1 Ответ

1 голос
/ 19 июня 2020

handler.postDelayed() добавляет объекты Runnable, которые вы предоставляете, в очередь сообщений, которые будут выполняться с указанным интервалом. Вам необходимо удалить все объекты в очереди из очереди сообщений, чтобы отменить выполнение. Вызов JSON.cancel(true) не влияет на другие объекты, которые уже добавлены в очередь.

Вам нужно будет сохранить ссылку на вашу реализацию Runnable, а затем вызвать handler.removeCallbacks(r), чтобы предотвратить дальнейшее выполнение. Вместо использования анонимного класса в handler.postDelayed().

Эта страница документации проливает больше света на этот вопрос. Также обратитесь к на этой странице , чтобы узнать, что происходит, когда вы вызываете cancel(true) в AsyncTask.

...