重复网络任务的最佳实践?

时间:2013-09-13 22:45:37

标签: android multithreading android-asynctask android-networking

我有一个小型的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对象然后重复使用它? 或者这会给我带来副作用吗?

提前致谢, 延。

3 个答案:

答案 0 :(得分:1)

  

是否可以选择一次创建CheckFtpTask对象然后重复使用它?或者这会给我带来副作用吗?

不,会有副作用。 Quoting the docs线程规则:

  

该任务只能执行一次(如果尝试第二次执行则会抛出异常。)

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

我不确定您为什么需要RunnableHandler。如果您需要更新AsyncTaskUI 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!