我有一个小型的Android应用程序,我需要每隔几秒钟做一些FTP的东西。 在学习了很难在UI线程上运行网络内容的东西是Android不喜欢的东西之后,我来到这个解决方案:
// This class gets declared inside my Activity
private class CheckFtpTask extends AsyncTask<Void, Void, Void> {
protected Void doInBackground(Void... dummy) {
Thread.currentThread().setName("CheckFtpTask");
// Here I'll do the FTP stuff
ftpStuff();
return null;
}
}
// Member variables inside my activity
private Handler checkFtpHandler;
private Runnable checkFtpRunnable;
// I set up the task later in some of my Activitiy's method:
checkFtpHandler = new Handler();
checkFtpRunnable = new Runnable() {
@Override
public void run() {
new CheckFtpTask().execute((Void[])null);
checkFtpHandler.postDelayed(checkFtpRunnable, 5000);
}
};
checkFtpRunnable.run();
这是一种很好的做法,可以执行无法直接在UI线程上运行的定期任务吗? 此外,不是通过调用
始终创建新的AsyncTask对象new CheckFtpTask().execute((Void[])null);
是否可以选择一次创建CheckFtpTask
对象然后重复使用它?
或者这会给我带来副作用吗?
提前致谢, 延。
答案 0 :(得分:1)
是否可以选择一次创建CheckFtpTask对象然后重复使用它?或者这会给我带来副作用吗?
不,会有副作用。 Quoting the docs线程规则:
该任务只能执行一次(如果尝试第二次执行则会抛出异常。)
每次要运行任务时,您只需要创建一个单独的任务实例。
我不确定您为什么需要Runnable
或Handler
。如果您需要更新AsyncTask
,UI Thread
的方法会在doInBackground()
上运行(实际上只有UI
)。
Check this answer如果您需要回调以在任务完成时更新UI
。
答案 1 :(得分:0)
您应该为每次通话创建一个新的异步任务。
请参阅Android文档:AsyncTask。根据这个文件:
该任务只能执行一次(如果尝试第二次执行则会抛出异常。)
专门查看线程规则部分。这里有一个类似的答案,https://stackoverflow.com/a/18547396/2728623
答案 2 :(得分:0)
Java线程池和Executor Framework允许您根据需要执行线程并减少线程创建开销。 Check out the singleThreadExecutor。线程池使用情况为pretty easy too!