在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 中的可见性设置