现在有一个应用,通过网络接受指令,然后刷新界面,大致过程这样:『1』接受网络指令,包含将要刷新对象的id,状态,等;『2』通过一个接受线程来接收『UDP通信』,将收到的指令通过消息发送到UI的消息处理单元『3』消息处理单元收到指令后,启动AsyncTask任务执行下面的过程 :通过指令中的ID 在程序中查找到对象(对象列表长度大概1000 ),然后根据状态在刷新界面『4』那有什么问题?:当我每秒收到64个指令的时候,也就是说每秒启动64个AsyncTask 任务的时候,程序就会崩溃,每个AsyncTask 执行任务的时间不等,如果减小到32个,程序崩溃的频率很低,那这个到底是android 系统的问题?还是设备的内存不够?有遇到过这个问题的讨论一下!

解决方案 »

  1.   

    程序流程有问题,不要启动这么多异步线程,应该是有个service在后台运行,执行那些操作后,通过发送消息的方式更新到UI上
      

  2.   


    任务划的太细了...你完全减少task 的个数。例如你可以在一次task里面刷新多个。。或者是就用一个task就可以了。你就算是一秒钟发n个task请求。ui 线程也是一个一个来处理的。
      

  3.   

    为何要64个指令用64个AsyncTask处理?为何不64个指令用1个AsyncTask处理呢?
    就算不崩溃,你可以保证所有真机都能游刃有余地处理吗?
    移动版系统开发要考虑内存、资源~
      

  4.   

    ...异步任务,你把他当做了简单的线程来用了(其实说白了也就是封装了一下的线程),但是应该利用它的特点,参数是可以指定的,当你执行异步任务的时候,将id等参数传入,那么在执行函数里只需要判断id之后,对指定的信息做刷新就好了,异步任务是单步执行的,也就是说保证线程的同步性,如果你觉得64个指令都在一个异步任务里执行影响效率,那可以分成2个来同步进行,但是这样的话,需要对不同的异步任务对象间做同步工作。
      

  5.   

    谢谢楼上的朋友回复在细化一下我的需求:
    (1)比如说我要做一个双向效果,我按一个按钮(自定义),发送一个指令给另一个设备,另一个设备收到指令后,给我反馈,告诉我说,我收到你按下的指令,然后,我在界面上才能显示按钮按下,如果没有反馈,我的界面是不动作的,按钮弹起时也是这样一个流程(2)上面的继续,发送一个按下消息给另外的设备后,另一个设备可能给我发送很多更新状态的指令?这个是不确定的!我现在测试采用的是64个,实际用户可能也是这个数目,或者少一些,所以不能说,我一次处理多少个?(3)从设备发回的反馈间隔也是不定的,可以编程,可以连续发送给我,或者每个中间有延时这样子
    任务划的太细了...你完全减少task 的个数。例如你可以在一次task里面刷新多个。。或者是就用一个task就可以了。你就算是一秒钟发n个task请求。ui 线程也是一个一个来处理的。
    ———————————————————————————————————————————————————————————————————————————————————考虑过这样的问题,task是不能重复使用的吧?只能新建!为何要64个指令用64个AsyncTask处理?为何不64个指令用1个AsyncTask处理呢?
    就算不崩溃,你可以保证所有真机都能游刃有余地处理吗?
    移动版系统开发要考虑内存、资源~
    ——————————————————————————————————————————————————————————————————————————————64个指令是我们测试的时候用的,可能是1-64个的每一种情况,并且要保证用户的操作及时反映到界面上,就是说我无法说几个指令放在一个AsyncTask 中处理,我收到一个指令,处理一个指令,如果不是有大量的任务,或者每一个任务中间有延时的话(不影响用户体验)是没有问题的
      

  6.   

    谢谢回复,我现在是无法预料有多少个指令?
    但准备就你提出的思路做下面的尝试 : 将收到的指令加入到一个队列,另启一个定时器(100ms)来取指令然后启动AsyncTask 来更新UI,这个100ms可能有几条指令,如果单纯的按钮一条指令的话,界面更新也不影响
      

  7.   

    谢谢管理员,帖子竟然被推荐到主页上面了,大家帮我看看这个帖子:http://topic.csdn.net/u/20110505/11/a082f6c0-a6f5-43ed-9110-1dd3db6db298.html
      

  8.   

    做个延迟等待好些,例如你等待100ms才相应,把这100ms收到的指令一次反馈回去,专业即使1s钟又64个指令,也就分10次就可以全部响应了,只要是这个延迟的时间是可以接受的就行。
    或者看看有没有办法优化每次执行的效率
      

  9.   

    引用 7 楼 crazy_ax 的回复:引用 5 楼 dinjay 的回复:...异步任务,你把他当做了简单的线程来用了(其实说白了也就是封装了一下的线程),但是应该利用它的特点,参数是可以指定的,当你执行异步任务的时候,将id等参数传入,那么在执行函数里只需要判断id之后,对指定的信息做刷新就好了,异步任务是单步执行的,也就是说保证线程的同步性,如果你觉得64个指令都在一个异步任务里执行影响效率,那可以分成2个来同步进行,但……
    做个延迟等待好些,例如你等待100ms才相应,把这100ms收到的指令一次反馈回去,专业即使1s钟又64个指令,也就分10次就可以全部响应了,只要是这个延迟的时间是可以接受的就行。
    或者看看有没有办法优化每次执行的效率顶
      

  10.   

    郁闷,AsyncTask 任务的 execute 函数,不定参数怎么填?
      

  11.   

    做了一个100~150ms的定时器,来收集任务,这样大概1~10个AsyncTask ,值得注意的是,在定时器处理函数中无法直接启动异步任务,需要再通过消息通知UI线程来执行AsyncTask.execute ,接贴啦,多谢上面的各位朋友!
      

  12.   

    为何要64个指令用64个AsyncTask处理?为何不64个指令用1个AsyncTask处理呢?
    就算不崩溃,你可以保证所有真机都能游刃有余地处理吗?
    移动版系统开发要考虑内存、资源~
      

  13.   


    你好,因为,这个64个只是测试数据,实际应用时数目不定,并且要实时反馈到界面上,所以只能采取到一个处理一个,最后的方法是,考虑到用户操作界面的体验,150ms间隔收集一次任务,有多少任务就放多少个任务给一个AsyncTask 处理,这样,一秒中大概7~8个AsyncTask ,还可以接受!
      

  14.   

    在搜索时,搜索到了自己的帖子,
    程序在变更了需求后这部分程序出现了问题。变更了的需求:更新一个连续变化的模拟量就是通过网络另一端的模拟量来更新界面,注意这个模拟量是向上增长或者向下减小的,就像进度条一样,比如:100ms 10个模拟量 (10、11、12、13、14、15、16、17、18、19),然后根据上面的模拟量在更新一个进度条类似的对象,现在发现界面显示时忽大忽小,(显示可能是这样的,但不限于,没有规律:10、11、13、14、12、16、17、19、18、15)跟踪显示是这个异步任务出现了问题,查文档说异步任务中对传入的任务是并行处理的,也就是在doInBackground函数中对于异步任务传入的处理数据不是顺序执行的。但是anroid 3.0以后google 将 execute 改成了两个,一个单任务/一个多任务
    对于现在测试的2.2/2.3 的设备各位有没有什么办法解决这个问题