java–ScheduledExecuterService.scheduleAtFixedRate创建多个线程池 –Android

java–ScheduledExecuterService.scheduleAtFixedRate创建多个线程池 –Android,第1张

概述我的Android应用程序中有一个名为UploadManager的AsyncTask,它检查已处理的项目,并将它们上传到服务器.为此,我使用ScheduledExecutorService.scheduleAtFixedRate每1分钟检查一次项目,并将它们上传到服务器.但是,有时会创建多个线程池(这种情况发生在10%的时间),因此有时会向服务

我的Android应用程序中有一个名为UploadManager的AsyncTask,它检查已处理的项目,并将它们上传到服务器.
为此,我使用scheduledexecutorservice.scheduleAtFixedrate每1分钟检查一次项目,并将它们上传到服务器.
但是,有时会创建多个线程池(这种情况发生在10%的时间),因此有时会向服务器发送两次相同的请求,尽管这种并发性在服务器和服务器上都得到了处理.客户端级别,但我仍然不希望这种情况发生在客户端.
下面是代码的样子.
在MainActivity(start-activity)中,我将UploadManager启动为:

public class MainActivity extends BaseActivity {   @OverrIDe   public voID onCreate(Bundle savedInstanceState) {       super.onCreate(savedInstanceState);       .       .       .       new UploadManager().execute(this);   }}

UploadManager的工作原理如下:

public class UploadManager extends AsyncTask<Context, Integer, Integer> {    private scheduledexecutorservice scheduledexecutorservice;    private static final int NUM_OF_THREADS = 5;    private static final int DELAY_IN_SECONDS = 60;    private Context context;    private final Logger logger = new Logger(getClass().getSimplename());    protected Integer doInBackground(Context... context) {        this.context = context[0];        scheduledexecutorservice = Executors.newScheduledThreadPool(NUM_OF_THREADS);        scheduledexecutorservice.scheduleAtFixedrate(postinformation, 5, DELAY_IN_SECONDS, TimeUnit.SECONDS);       return 0;    }    private Runnable postinformation = new Runnable() {        @OverrIDe        public voID run() {            if (NetworkManager.isInternetAvailable(context)) {                uploadAckNowledgement();            }        }    };    private voID uploadAckNowledgement() {        List<AckNowledgement> ackList = null;        try {            logger.info("RUNNING TASK TO POST ACKNowLEDGEMENT");            .            .        }    }}

当我检查日志时,它说:

35119 [pool-2-thread-1] INFO  Upload Manager - [1363841355530] : 21/03/2013 10:19:15 : RUNNING TASK TO POST ACKNowLEDGEMENT  35122 [pool-3-thread-1] INFO  Upload Manager - [1363841355532] : 21/03/2013 10:19:15 : RUNNING TASK TO POST ACKNowLEDGEMENT

这清楚地表明现在有多个线程池,因此,uploadAckNowledgement()方法被多次调用.

MainActivity在AndroIDManifest.xml中声明为:

<application androID:label="@string/app_name" androID:icon="@drawable/icon">    <activity androID:name="MainActivity"              androID:label="@string/app_name"              androID:theme="@androID:style/theme.NoTitlebar">        <intent-filter>            <action androID:name="androID.intent.action.MAIN"/>            <category androID:name="androID.intent.category.LAUNCHER"/>            <action androID:name="androID.net.conn.CONNECTIVITY_CHANGE"/>        </intent-filter>    </activity>    .    .

解决方法:

我最终想出了原因,如果ScheduledExecutor的服务运行重叠,那么它会产生新的工作线程(例如,在这种情况下,postinformation()创建一个新的工作线程),最终产生一个新的池.
但是,使用newSingleThreadScheduledExecutor而不是newScheduledThreadPool(int corePoolSize)’可以避免多个worker.
因此,不要将`scheduledexecutorservice’初始化为:

scheduledexecutorservice = Executors.newScheduledThreadPool(NUM_OF_THREADS);  

它应该被初始化为:

scheduledexecutorservice = Executors.newSingleThreadScheduledExecutor();  

这样就可以确保没有多个工作线程在运行.

总结

以上是内存溢出为你收集整理的java – ScheduledExecuterService.scheduleAtFixedRate创建多个线程池 – Android全部内容,希望文章能够帮你解决java – ScheduledExecuterService.scheduleAtFixedRate创建多个线程池 – Android所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1116982.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-29
下一篇 2022-05-29

发表评论

登录后才能评论

评论列表(0条)

保存