默认
发表评论 12
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
[已解决] AsyncTask会影响到联网?(已解决,感谢各位)
阅读(43993) | 评论(12 收藏 淘帖1
AsyncTask
在doInBackground中执行联网过程,会影响接收IM的心跳包,
new Thread的方式就不会影响。。。
-----------
示例代码段:

不会影响心跳的代码:
                new Thread(){public void run() {
                        try {
                                Thread.sleep(2000);
                        } catch (InterruptedException e) {
                                e.printStackTrace();
                        }
                        mHandler.post(new Runnable() {
                                public void run() {
                                        manager_dept_listview.onRefreshComplete();
                                }
                        });
                };}.start();

会影响心跳的方法:
                new AsyncTask<String, Void, String>() {
                        protected String doInBackground(String... params) {
                                try {
                                        Thread.sleep(20000);
                                        //模拟访问网络获取数据,因为网络原因,我这里时常会出现联网获取数据需要十几秒的情况
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
                                return null;
                        }

                        protected void onPostExecute(String result) {
                                manager_dept_listview.onRefreshComplete();
                        };
                }.execute();

--------------
AsyncTask中的doInBackground方法不是另起线程访问网络吗?
为什么会影响到im的心跳包?
在执行doInBackground的过程中,完全接收不到IM的心跳包!


即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:MobileIMSDK
上一篇:IOS编译与我项目中的GCDAsyncUdpSocket冲突问题下一篇:[已回复] 关于MobileIMSDK与其他推送框架的互通问题

本帖已收录至以下技术专辑

推荐方案
评论 12
引用:IMDeveloper 发表于 2016-05-24 16:51
准确的解释是Android2.3及以前的版本AsyncTask线程池默认是5个,所以不会有问题。
而自3.0及以后版本里, ...

好的,谢谢
准确的解释是Android2.3及以前的版本AsyncTask线程池默认是5个,所以不会有问题。
而自3.0及以后版本里,调用AsyncTask的默认方法其实相当于是队列的形式逐个执行,new AsyncTask<String, Void, String>() {.......}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);其实相当于Android2.3时代码的默认方法就是这样。

借此可以好好学习一下,看看这个帖子哦,讲的很清楚了:http://www.xuebuyuan.com/1025245.html
签名: 国庆长假还没有缓过来,请让我静一静,产品狗死远点...
引用:Eagle0922 发表于 2016-05-24 16:40
已解决,感谢各位;
使用方式:
new AsyncTask() {.......}.executeOnExecutor(AsyncTask.THREAD_POOL_EX ...

这个问题真没碰到过呢。学习了学习了
好的,学习了。
已解决,感谢各位;
使用方式:
new AsyncTask<String, Void, String>() {.......}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
看看这源码,AsyncTask确实是个线程池实现,但一个线程池的线程数量是有限的,你可以试上你上面的说的方法,但我建议你好好排查下你的代码,或许另有隐患:http://blog.csdn.net/pipisky2006/article/details/8270222
引用:JackJiang 发表于 2016-05-24 16:29
理论上Android里的AsyncTask是模仿Java Swing里的SwingWorker这个东西,而SwingWork本身的实现是一个线程池 ...

嗯  谢谢,我试着按群里说的调用executeOnExecutor试试看
理论上Android里的AsyncTask是模仿Java Swing里的SwingWorker这个东西,而SwingWork本身的实现是一个线程池。

AsyncTask没有仔细去研究过,但是它不太可能是个单线程队列实现的吧。。。
建议你去查下AsynTask的官方说明。
引用:JackJiang 发表于 2016-05-24 16:25
用Thread就不会?

是的
用Thread就不会?
引用:JackJiang 发表于 2016-05-24 16:22
你的意思是,你的AsyncTask的doInbackgroud方面里的耗时操作会阻塞其它的AsyncTask?

不知道是不是阻塞其他AsyncTask,反正在调试输出的Debug信息中,只要AsyncTask联网获取数据,执行doInBackground,就收不到IM服务端发出的心跳包
你的意思是,你的AsyncTask的doInbackgroud方面里的耗时操作会阻塞其它的AsyncTask?
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部