在java中停止异步任务的onPostExecute

Posted

技术标签:

【中文标题】在java中停止异步任务的onPostExecute【英文标题】:Stop the onPostExecute of an Async Task in java 【发布时间】: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

    

感谢您的帮助!

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于在java中停止异步任务的onPostExecute的主要内容,如果未能解决你的问题,请参考以下文章

在异步任务中更改 onPostexecute 中的可见性设置

在android中链接2个异步任务的正确方法

异步任务的空指针异常

如何在 Android 中使用异步任务通过数组列表更新列表视图?

Android异步任务不会改变用户界面

从 onPostExecute(String result) 开始活动不设置 ui 标志