我现在正处理一个相当常见的情况 - 通过网络下载一些数据,然后更新视图以显示它.显然,我想在后台进行Web下载,然后在主UI线程上更新视图.现在看看我的代码,我有点担心我的Activity和它的UI元素在我更新它们之前被杀掉了.这是我心中的本质:
Thread update = new Thread() {
public void run() {
final Data newData = requestData();
if (newData != null) {
post(new Runnable() {
public void run() {
Toast.makeText(MyClass.this, "I'll do things here that depend on my context and views being valid", Toast.LENGTH_SHORT).show();
}
});
}
}
};
update.start();
Run Code Online (Sandbox Code Playgroud)
似乎有可能在我下载数据时,活动可能会被破坏.那么会发生什么?我的线程会继续执行吗?我最终会尝试访问死对象吗?
通常我是通过AsycTask来做的,但这次工作看起来很简单,只是内联线程启动线程的东西.我会通过使用AsyncTask来改善目标吗?
我正在创建一个新闻阅读器应用程序,有时会将网页加载到WebView.
我注意到,使用默认行为时,缓存很快就会变得非常不合理.当内存不足时,Android是否会清除缓存,我不满意我的用户看到15MB新闻应用程序,除了Web缓存之外的所有内容都是1MB左右.
但是,我希望在某种程度上使用缓存.我看到了WebSettings #setAppCacheMaxSize(),看起来它只是票.
它似乎没有做任何事情.在将任何内容加载之前,我将以下内容硬编码到我的活动的onCreate()调用的方法中:
originalSourceWebView.getSettings().setAppCacheMaxSize(300*1024); (我使用的是一个更大的,可配置的值,但将其降低以确认我的问题).
我毫不夸张地向右吹300KB,如图所示settings->applications->manage applications->click on my app.我在WebChromeClient#onReachedAppMaxCacheSize中监听事件,但似乎从未触发过.
有没有人成功使用过这个?我应该尝试管理一些不同的缓存吗?文档看起来很稀疏.我进入了android源代码,但它只是将值发送到本机代码,我不知道如何深入研究它.
我的测试环境是2.2.2的关联环境.我知道我需要通过反射进行缓存调用以支持1.5和1.6,但是如果我不能使这个工作,就没有必要了.
我正在开发一个涉及和ExpandableListView的应用程序.我们想用我们自己选择的一个替换groupIndicator.
我为指标创建了一个规范,根据选择器的状态(扩展或不扩展)显示不同的png
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/arrow_down" android:state_expanded="true"/>
<item android:drawable="@drawable/arrow_right"/>
</selector>
Run Code Online (Sandbox Code Playgroud)
然后我设置我的布局xml使用:
(请注意,childDivider是一个像素高的png而不是颜色,因为设置为颜色似乎有问题)
这是有效的,除了我们的图标是垂直伸展的.这是有道理的,因为我们刚刚创建了一个25x25的图标,希望是最好的.我正在试图弄清楚原生图标的尺寸,以便我可以匹配它,但这就是我遇到麻烦的地方.
挖掘源代码(ExpandableListView.java)我发现,默认情况下,该类将使用com.android.internal.R.styleable.ExpandableListView_groupIndicator.所以我有一个id,但还没有图标.
我很乐意能够做到:
Bitmap image = BitmapFactory.decodeResource(this.getResources(), com.android.internal.R.styleable.ExpandableListView_groupIndicator);
imWidth = image.getWidth();
imHeight = image.getHeight();
Run Code Online (Sandbox Code Playgroud)
但正如"内部"所暗示的那样,在用户空间中我并不可见.
我还在ExpandableListView.java中找到了getIndicate(),但它是私有的,所以我也无法做到这一点.
我很想深入了解平台源代码,我不知道如何追踪该图像.谁能帮我吗?
编辑:感谢CommonsWare.为其他任何人寻找其余部分:
android:drawable/expander_group在/frameworks/base/core/res/res/drawable/expander_group.xml中定义.
expander_group.xml提到它使用@ drawable/expander_ic_maximized和@ drawable/expander_ic_minimized.这些drawable可以在/frameworks/base/core/res/res/drawable/expander_ic_maximized.9.png和/frameworks/base/core/res/res/drawable/expander_ic_minimized.9.png中找到,以及特定密度的其他地方等等."9"解释了为什么默认图标没有失真问题 - 它们是补丁9图形.与图标密度无关的版本为34px×38px.