gpt4 book ai didi

java - 确定方法是否为 `RemotableViewMethod`

转载 作者:搜寻专家 更新时间:2023-11-01 09:05:21 31 4
gpt4 key购买 nike

我正在构建一个包含 ProgressBar 的 Widget。如果小部件正在计算,我将该 ProgressBar 的可见性设置为 VISIBLE,如果所有计算都停止,则设置为 INVISIBILE。应该没有问题,因为 setVisibility 记录为 RemotableViewMethod。然而,HTC 的某些人似乎忘记了它(即在 Wildfire S 上),因此调用 RemoteViews.setVisibility 将导致崩溃。出于这个原因,我尝试执行一个检查,看看 setVisibility 是否真的可以调用。我为此编写了这个方法:

private boolean canShowProgress(){
LogCat.d(TAG, "canShowProgress");
Class<ProgressBar> barclz = ProgressBar.class;
try {
Method method = barclz.getMethod("setVisibility", new Class[]{int.class});
Annotation[] anot = method.getDeclaredAnnotations();
return anot.length > 0;
} catch (SecurityException e) {
LogCat.stackTrace(TAG, e);
} catch (NoSuchMethodException e) {
LogCat.stackTrace(TAG, e);
}
return false;
}

这会起作用,但真的很丑陋,因为如果任何注释存在,它将返回“True”。我查看了 RemoteView 本身是如何进行查找的,并发现了这一点:

if (!method.isAnnotationPresent(RemotableViewMethod.class)) {
throw new ActionException("view: " + klass.getName()
+ " can't use method with RemoteViews: "
+ this.methodName + "(" + param.getName() + ")");
}

但我不能这样做,因为类 RemotableViewMethod 无法通过 sdk 访问。如何知道是否可以访问?

最佳答案

通过写下我的问题,我有了按名称查找类(class)的想法,并且成功了。所以我将我的方法更新为以下内容:

private boolean canShowProgress(){
LogCat.d(TAG, "canShowProgress");
Class<ProgressBar> barclz = ProgressBar.class;
try {
Method method = barclz.getMethod("setVisibility", new Class[]{int.class});
Class c = null;
try {
c = Class.forName("android.view.RemotableViewMethod");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return (this.showProgress= (c != null && method.isAnnotationPresent(c)));


} catch (SecurityException e) {
LogCat.stackTrace(TAG, e);
} catch (NoSuchMethodException e) {
LogCat.stackTrace(TAG, e);

}
return false;
}

完美运行

关于java - 确定方法是否为 `RemotableViewMethod`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12280667/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com