当前位置: 首页 > 知识库问答 >
问题:

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

百里修真
2023-03-14

我有一个小型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线程上运行的重复任务的好做法吗?此外,而不是通过调用始终创建一个新的Asyncask对象

new CheckFtpTask().execute((Void[])null);

创建< code>CheckFtpTask对象一次,然后重用它,这是一种选择吗?还是会给我带来副作用?

先谢谢你Jens

共有3个答案

袁河
2023-03-14

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

崔棋
2023-03-14

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

参见Android文档:AsyncTask。根据该文件:

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

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

章宏恺
2023-03-14

是否可以选择创建一次检查Ftp任务对象,然后重用它?还是会给我带来副作用?

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

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

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

而且我不知道为什么需要Runnable或Handler。如果您需要更新UI,AsyncTask具有在UI Thread上运行的方法(实际上除了doInbackground()之外)。

如果需要在任务完成后进行回调以更新 UI,请检查此答案。

 类似资料:
  • 本文向大家介绍TensorFlow搭建神经网络最佳实践,包括了TensorFlow搭建神经网络最佳实践的使用技巧和注意事项,需要的朋友参考一下 一、TensorFLow完整样例 在MNIST数据集上,搭建一个简单神经网络结构,一个包含ReLU单元的非线性化处理的两层神经网络。在训练神经网络的时候,使用带指数衰减的学习率设置、使用正则化来避免过拟合、使用滑动平均模型来使得最终的模型更加健壮。 程序将

  • 问题内容: 我已经使用python多年了,但是我对python Web编程的经验很少。我想创建一个非常简单的Web服务,该服务公开来自现有python脚本的一些功能以供公司使用。它可能会在csv中返回结果。什么是最快的方法?如果它影响您的建议,那么我很可能会在此之后添加更多功能。 问题答案: 看看werkzeug。Werkzeug最初是用于WSGI应用程序的各种实用程序的简单集合,现已成为最高级的

  • 问题内容: 我想启动许多要在+ -42Mio记录的数据库上运行的任务。我想批量运行5000条记录/时间(结果是850个任务)。我还想将线程数限制为16个,因此Java开始为我执行此操作,并且我正在使用当前代码来完成此任务: 这是正确的方法吗?特别是当我有一种印象,即Java会触发所有任务…(实现) 问题答案: 使用ExecutorService的第一部分看起来不错: 带有Thread的部分不应该在

  • 在当今99%的移动应用中网络都是必不可缺的一部分:总是需要连接远程服务器来检索App需要的信息。 作为网络访问的第一个案例,我们将创建下面这样一个场景: 加载一个进度条。 用一个按钮开始文件下载。 下载过程中更新进度条。 下载完后开始视频播放。 我们的用户界面非常简单,我们只需要一个有趣的进度条和一个下载按钮。 首先,我们创建mDownloadProgress private PublishSub

  • 鉴于: 我想尝试,并重试,连接到服务器3次才放弃。 我可以把整个try/catch放在一个循环中,但是这是否符合Java的“最佳实践”。从我对该主题的回忆来看,这将是对语句的误用。再说一次,我可能完全错了。你怎么认为?

  • 假设一个正在运行一个设置为并行的集群 使用每个任务槽运行多个TM 使用多个任务槽运行单个/几个TM 我们正在运行版本为1.6.3的Flink群集。Flink 1.7发行说明指出,“Flink现在正确地支持具有多个插槽的TaskManager”。在以前的版本中,是否建议从单个插槽开始?