小编kaa*_*aay的帖子

Android应用程序组件破坏和娱乐的详细信息

有人会把我推向一些具体的,值得信赖的(最好是简明的)有关以下方面的信息:

  1. 系统重新创建组件的顺序和(如果适用)(片段,活动,活动的线程/ AsyncTasks /定时器,静态数据(何时卸载类?),其他类中的线程/ AsyncTasks /定时器,主机TabActivity,当应用程序在后台和前台时,ActivityGroup,绑定本地服务,应用程序,进程).
    破坏可以在哪些点停止(返回应用程序时会遇到什么状态 - 比如"包括应用程序对象在内的所有状态都被破坏,进程处于活动状态"?

  2. 是否有可能(不修改Android)以编程方式自己导致相同类型的破坏,因此它与系统何时进行无法区分,或者是当我们自己选择释放内存时需要的单独机制(由onLowMemory触发)?

  3. 来自1)的所有场景的可靠再现步骤(junit.framework会吗?我还没有调查过)?

  4. " 如果用户长时间离开任务,系统将清除除根活动之外的所有活动的任务.当用户再次返回任务时,只恢复根活动 ":这是否与进程/组件不同生命周期/破坏,还是与之相关?

我已阅读各种来源提供信息,通常不完整和误导,有时不正确.
我承认,我已经浏览了文档的某些部分,所以我可能错过了或误解了一些东西.

[编辑]为了避免误解:我要问的是Android破坏组件以释放内存,绕过 Activity.onDestroy.
当我将应用程序放在后台并稍后返回时,将出现以下序列之一:

  • onPause,onStop,onRestart,onStart,onResume
  • onPause,onStop,Application.onCreate,onCreate(notNull),onStart,onResume

[EDIT2] Bounty开始了.需要可靠的信息:活动,碎片,应用程序,绑定(可能是远程)服务,流程.
部分/完全销毁方案.见第1点.

android android-lifecycle android-activity

20
推荐指数
1
解决办法
1659
查看次数

关于延迟加载适配器中的位图的共识(强调Bitmap.recycle())

我看到了大量的建议,但没有(我发现)考虑了所有因素,因素是:

  1. 异步下载,没有重复(下载和位图),取消下载/分配不再需要的图像
  2. 一个适配器可以有多个视图用于相同的ID(对getView(0)的调用非常频繁)
  3. 无法保证视图不会丢失而不是回收(考虑List/GridView调整大小或按文本过滤)
  4. 视图和数据/逻辑的分离(尽可能多)
  5. 不为每次下载启动单独的线程(UI的可见减速).使用队列/堆栈(LinkedBlockingQueue?)和线程池,或某些....但需要结束,如果活动被销毁.
  6. 清除位图与列表/网格中的当前位置相距足够远,优选仅在需要存储器时
  7. 在要丢弃的每个Bitmap上调用recycle().
  8. 外部存储器可能无法使用(无论是在任何时候还是在所有时间),如果使用,应该清除(仅在此处下载的图像).还要考虑Android的Activity destroy/recreation.
  9. 数据被更改:删除条目(在列表中选择,要删除的按钮,立即刷新)并添加到后台线程(按需刷新列表).已经下载的位图应该保留,只要它们链接的条目仍然存在.
  10. (可选)不依赖于notifyDataSetChanged(其中,afaik,刷新所有可见的,可能非常复杂的列表项)来更新单个ImageView
  11. setTextFilterEnabled(true)(如在ArrayAdapter中.它的Filterable实现替换了其他Adapter方法可见的数据数组,因此更改了视图的索引,因此它们不能用作链接到Bitmaps的ID).
  12. 可用于ExpandableList(影响缩略图的显示顺序)

如果有人回答,请原谅我.我搜索了几个月,但没有找到解决方案.

这些要求对我来说似乎是合理的,但每一个都增加了一个难度维度,特别是Bitmap.recycle,需要在操作和Activity销毁期间调用(注意onDestroy,甚至onStop可能不会被调用).
这也排除了依赖SoftReferences,它可能会处理其他一些问题.
是的,这是必要的,或者即使在任何数量的gc,sleep(20s,偶数),yield和try-catch中的大量数组分配(强制控制的低内存情况)之后我得到OutOfMemoryError.
搜索"OutOfMemoryError:位图大小超过VM预算"或"android位图回收".
是的,我正在重新采样位图.

android lazy-loading bitmap adapter recycle

11
推荐指数
0
解决办法
584
查看次数

异步下载适配器中的位图,重点介绍Bitmap.recycle()

有人能告诉我如何为异步制作一个好的机制.下载用于ListView/GridView的图像?有许多建议,但每个只考虑典型要求的一小部分.

下面我列出了一些合理的因素(要求或要考虑的因素),我和我的同事们不能立刻满足.
我不是要求代码(虽然它是受欢迎的),只是一种管理所描述的位图的方法.

  1. 没有重复的下载程序或位图
  2. 取消下载/分配不再需要或可能自动删除的图像(SoftReference等)
  3. 注意:适配器可以有多个视图用于相同的ID(对getView(0)的调用非常频繁)
  4. 注意:无法保证视图不会丢失而不是回收(考虑List/GridView调整大小或按文本过滤)
  5. 视图和数据/逻辑的分离(尽可能多)
  6. 不为每次下载启动单独的线程(UI的可见减速).使用队列/堆栈(BlockingQueue?)和线程池,或某些....但需要结束,如果活动停止.
  7. 清除位图与列表/网格中的当前位置相距足够远,优选仅在需要存储器时
  8. 在要丢弃的每个Bitmap上调用recycle().
  9. 注意:外部存储器可能无法使用(无论是在任何时候还是在所有时间),如果使用的话,应该尽快清除(仅限于此处下载的图像)(考虑Android的Activity destroy/recreation)
  10. 注意:可以更改数据:删除条目(多选和删除)并添加(在后台线程中).已经下载的位图应该保留,只要它们链接的条目仍然存在.
  11. setTextFilterEnabled(true)(如果基于ArrayAdapter的机制,将影响数组索引)
  12. 可用于ExpandableList(影响缩略图的显示顺序)
  13. (可选)下载Bitmap时,只刷新相关的ImageView(列表项可能非常复杂)

请不要发布个别积分的答案.我的问题是,我们越是专注于某些方面,其他人就越模糊,海森堡就像.
每个都增加了难度维度,特别是Bitmap.recycle,需要在操作和Activity销毁期间调用(请注意onDestroy,甚至onStop可能不会被调用).
这也排除了依赖SoftReferences.
这是必要的,或者我甚至在使用任何数量的gc,sleep(20s,偶数),在try-catch(以强制受控的OutOfMemory)之后产生和大量数组分配后得到OutOfMemoryError.
我已经重新采样了Bitmaps.

android lazy-loading bitmap adapter recycle

7
推荐指数
1
解决办法
1501
查看次数

EditText的onFocusChange中的setSelection

通常,单击视图时,文本光标将设置在您单击的位置附近.
我尝试将它始终设置到最后(超过最后一个字符),但除非操作被延迟,否则它什么都不做.
下列:

new OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus) {
            EditText et = (EditText) v;
            et.setSelection(et.getText().length());
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

不起作用.延迟setSelection部分:

Handler handler = new Handler();
handler.postDelayed(new Runnable() {
    @Override
    public void run() {
        et.setSelection(et.getText().length());
    }
}, 40);
Run Code Online (Sandbox Code Playgroud)

使它工作,但是不好的做法.

还有哪些更好的选择?OnClickListenerOnTouchListener(ACTION_DOWN和ACTION_UP两者)也没有帮助.

android focus

1
推荐指数
1
解决办法
814
查看次数