- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试在旧的 Android 2.2 应用程序中使用 ViewPager.PageTransformer
界面。我的目标 API 是 8 级。但是在 ViewPager
compat library class
if (Build.VERSION.SDK_INT >= 11) {
final boolean hasTransformer = transformer != null;
final boolean needsPopulate = hasTransformer != (mPageTransformer ....
}
因为这个检查 PageTransformer
在旧的 Android 中不起作用,即使有很棒的 NineOldAndroids
库也是如此。
我知道有一些可用的解决方案,其中之一是更改 ViewPager
类的默认实现。此外,github 上提供了不带此检查的 dafault compat 库的分支。
当然,我可以使用这个库,或者自己更改它并使用我自定义的 ViewPager
类。
但是在这种情况下出现了很多问题。
最重要的是,您不能将此自定义类与其他库一起使用,例如 ViewPageIndicator
,因为它们是为默认的 ViewPager
类创建的。
首先,我想实现什么?
我的想法是为我的目的创建一些库和自定义 View ,这个自定义 View 将包括页面指示器、 View 分页器和一些其他 View 。
因此库的用户不必直接使用 ViewPager
,它将仅使用自定义 View 和库中的一些其他类。
我有不同的想法如何解决这个问题。
只需创建自定义 ViewPager
,使用我的自定义实现从依赖于 ViewPager
的其他库编辑类,只是为了更改类成员的类型。因此,只需向用户隐藏所有这些肮脏的东西,并允许他使用自定义 View 的方法。
使用反射。起初,我认为这是个坏主意,因为它相当昂贵,我是这么认为的,但后来我在官方 Android 开发博客上找到了这篇文章 Android Backward Compatibility .下面是如何使用反射来实现向后兼容的示例。如果在这种情况下使用反射,我可以简单地覆盖方法而不是调用 super,更改部分,但它看起来真的很笨重和丑陋。但是我们将有一个很大的优势,我们可以在任何需要默认 ViewPager
的地方使用这个自定义类。
也许还有另一种好方法可以解决这个问题。
但我真的很关心性能,因为这段代码应该在旧设备上运行,它应该尽可能轻量级。
请建议在这种情况下遵循的最佳方法,只需使用默认实现实现我想做的任何事情的库,并使其对用户隐藏或使用反射并保存与其他类的兼容性。
如果有任何帮助和建议,我将不胜感激。谢谢。
最佳答案
首先,我尝试更改 ViewPager
的默认实现并在库中使用它。我干脆去掉了API检查,开始写库的其他部分。
很快我就陷入了第一个问题,而不是另一个问题。所以我的代码变成了一些奇怪的东西。
在使用自定义 ViewPager
类的情况下,兼容性将完全破坏。
我必须将所有需要的库放入我的项目中,以使其与使用默认 ViewPager
的其他库伪兼容。仅用于更改这些类中的参数和字段。
总而言之,我回到了反射(reflection)。它看起来非常丑陋并且假装是一种不好的做法,但在这种情况下我找不到更好的解决方案(如果有请举个例子)。
我已经完成了一些基准测试,并测量了使用反射和默认方法调用方法所需的时间。
结果是。
默认方法第一次的延迟为 0(甚至以纳秒为单位)。但它最多花费 30517ns
。
反射看起来很重。调用此方法需要 10000000 到 50000000 ns
。但此外,它将来自某些(不同)服务的 ANR 错误打印到调试日志中。这是此类消息的示例。
05-09 22:39:50.995 169-187/? E/ActivityManager﹕ ANR in com.google.android.gms Reason: Executing service com.google.android.gms/.icing.service.IndexWorkerService Load: 3.06 / 3.08 / 3.0 CPU usage from 5830ms to 0ms ago: 4.1% 169/system_server: 3% user + 1% kernel / faults: 158 minor 0.3% 123/adbd: 0% user + 0.3% kernel / faults: 15 minor 0.3% 2137/lib.performancecheck: 0.3% user + 0% kernel / faults: 28 minor 0% 245/tiwlan_wq: 0% user + 0% kernel 6% TOTAL: 3.7% user + 2.2% kernel CPU usage from 513ms to 1124ms later.......
这种情况不是每次都会发生,但主要是在应用程序首次启动时发生,因此使用反射调用方法需要花费很多时间。
就此方法不会被频繁调用而言,也许这是可以接受的解决方案,可能只在 Activity 开始时调用一次,或者根本不调用?
我担心这条消息,有任何真正的 ANR(当然是因为它不应该响应更长的时间)。此消息是否会在将来引起问题,在这种情况下我真的应该摆脱反射吗?也许有其他方法可以解决这个问题。
这是使用反射的setPageTransformer
方法的代码。
@Override
public void setPageTransformer(boolean reverseDrawingOrder, PageTransformer transformer) {
Log.d("VIEWPAGER","Inside overridden method Reflection");
if (Build.VERSION.SDK_INT >= 11) {
super.setPageTransformer(reverseDrawingOrder, transformer);
}
else {
final boolean hasTransformer = transformer != null;
Class<?> clazz =this.getClass();
while(clazz!=null && !clazz.getSimpleName().equals("ViewPager")) {
clazz = clazz.getSuperclass();
}
Log.d("VIEWPAGER", clazz.getSimpleName());
try {
Field pageTransformerField = clazz.getDeclaredField("mPageTransformer");
pageTransformerField.setAccessible(true);
PageTransformer pageTransformer = (PageTransformer) pageTransformerField.get(this);
final boolean needsPopulate = hasTransformer != (pageTransformer != null);
pageTransformerField.set(this, transformer);
Method drawingOrderMethod = clazz.getDeclaredMethod("setChildrenDrawingOrderEnabledCompat",boolean.class);
drawingOrderMethod.setAccessible(true);
drawingOrderMethod.invoke(this,hasTransformer);
Field drawingOrderField = clazz.getDeclaredField("mDrawingOrder");
drawingOrderField.setAccessible(true);
if (hasTransformer) {
drawingOrderField.set(this, reverseDrawingOrder ? DRAW_ORDER_REVERSE : DRAW_ORDER_FORWARD);
} else {
drawingOrderField.set(this, DRAW_ORDER_DEFAULT);
}
if (needsPopulate) {
Method populateMethod = clazz.getDeclaredMethod("populate");
populateMethod.setAccessible(true);
populateMethod.invoke(this);
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
}
关于android - 编辑框架类实现 Android 以实现向后兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30019326/
这不是我的专业领域,所以我希望问的是正确的问题。 我们有一台滚动租用的服务器。旧服务器是32位windows服务器,新服务器是64位windows 2008 R2 SP1。 其中一个 Web 应用程序
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我已将 Oracle 数据库从 10g 迁移到 12c。从 12c 开始,oracle 不支持 PLSQL_V2_COMPATIBILITY 参数。 该参数用于: https://www.safari
开发环境db server为SqlServer 2005(开发版) 有什么方法可以确保我的 SQL 查询将在 SqlServer 2000 中运行? 此数据库设置为兼容级别“SQL Server 20
我有一个这种形式的类: public class Foo implements Serializable { private static final long serialVersionUI
我有以下代码来隐藏状态栏,取自 http://developer.android.com/training/system-ui/status.html和 Hide status bar android
我正在尝试测试 .prop() 是否方法存在于当前包含的 jQuery 中(出于兼容性原因): if(typeof $.prop === 'function') 我期望上面的条件是 true对于 jQ
当收到新消息时,我在项目中使用BroadcastChannel更改所有选项卡的标题。 问题在于它仅适用于chrome和firefox。因此,我决定使用localStorage创建一个Broadcast
我正在使用一个函数通过 FTP 将一个文件上传到我的服务器。这是我的代码并且工作正常但是创建的文件 example.json 不兼容 UTF8,因为它有 Atlético 而不是 Atlético 例
我正在使用兼容性类来构建用户代理字符串: public abstract class Compatibility { private static int sdkInt = 0; pr
我需要实现一个 C 例程来(解)压缩 gzip 格式的文件。 谁能举个例子? 我试过 zlib,但它似乎不兼容。 谢谢。 最佳答案 zlib 与 gzip 文件完全兼容,但您需要确保您使用的是面向 g
我正在使用以下 CSS 代码,它与 Chrome 完美兼容,但与 IE 浏览器不兼容 .collapse{ display:block; } .collapse + input[type="c
我的应用程序以 android Sdk 的 v10 为目标,但具有 minSdkVersion 的 v6。默认情况下,“match_parent”属性将用于宽度或高度。我应该为 fill_parent
我正在阅读有关 dynamic_cast 的内容,然后我遇到了以下语句 ( from cplusplus.com ): Compatibility note: This type of dynamic
我正在尝试在 Linux 下使用 QtCreator 构建一个用 VS 2008 编写的项目,但我遇到了很多错误: /home/ga/dev/CppGroup/MonteCarlo/main.cpp:
因此,我正在构建一个网站,用户可以在该网站上上传观看视频。我正在使用标准的 HTML5 视频播放器 ( ... )目前,我使用多个来源:MP4、OGG 和 WEBM,以实现跨浏览器兼容性 由于维护三
mozilla 和其他浏览器是否有类似-webkit-box-reflect 的属性?我无法在谷歌上找到哪些其他浏览器支持这个。因此,如果有人可以告诉我或给我链接,那就太好了。 最佳答案 这不仅可以使
我定义了一个自定义的 ValidateSet 参数属性,如下所示: Class MyValidValuesAttribute : System.Management.Automation.IValid
我使用 .net 4.0、linq 等编写 winforms 应用程序。它可以在带有 .net 2.0 的机器上运行吗? 最佳答案 不,不会。为 Framework 4.0 版编译的应用程序将要求该框
我如何专门检查 @keyframes translate3d 动画 与浏览器的兼容性? 请不要关闭这个问题,因为在问这个问题之前我已经尝试了很多 stackoverflow 解决方案。 我想检查我的网
我是一名优秀的程序员,十分优秀!