5

我有一个小型 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一次对象然后重用它?还是会给我带来副作用?

在此先感谢,詹斯。

4

3 回答 3

1

是否可以选择一次创建 CheckFtpTask 对象然后重用它?还是会给我带来副作用?

不会,会有副作用。引用文档线程规则:

该任务只能执行一次(如果尝试第二次执行将引发异常。)

每次要运行它时,您只需要创建一个单独的任务实例。

而且我不确定您为什么需要Runnableor Handler。如果您AsyncTask需要更新.UI ThreaddoInBackground()UI

如果您需要回调来更新UI任务完成的时间,请检查此答案。

于 2013-09-13T22:58:10.813 回答
0

您应该为每个调用创建一个新的异步任务。

请参阅 Android 文档:AsyncTask。根据此文档:

该任务只能执行一次(如果尝试第二次执行将引发异常。)

具体查看线程规则部分。这里有一个类似的答案,https://stackoverflow.com/a/18547396/2728623

于 2013-09-13T22:59:05.973 回答
0

Java ThreadPools 和 ExecutorFramework 允许您根据需要执行线程并减少线程创建开销。查看 singleThreadExecutor。线程池的使用也很简单!

于 2013-09-14T01:24:37.790 回答