我从命令行构建了我的android项目,并使用ant debug install
进行编译。但是当我导入一个名为Android-PullToRefresh的外部项目到我的项目后,我的项目在运行时变得异常。有时在我添加一个新的id或删除一个id在xml布局文件,我的编译很好,但当应用程序开始运行时,它抛出一个ClassCastException
。
当它发生时,我只能使用ant clean && ant debug install
来修复它。但是重新编译一个漏洞项目需要双倍的时间,我不希望编译一个项目一分钟或更长时间。我能做些什么让这个错误不再发生吗?
堆栈跟踪:
E/AndroidRuntime(21226): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.zhangdan.preferential/com.zhangdan.preferential.RecommendActivity}: java.lang.ClassCastException: android.widget.TextView cannot be cast to com.handmark.pulltorefresh.library.PullToRefreshListView
E/AndroidRuntime(21226): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2185)
E/AndroidRuntime(21226): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2210)
E/AndroidRuntime(21226): at android.app.ActivityThread.access$600(ActivityThread.java:142)
E/AndroidRuntime(21226): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1208)
E/AndroidRuntime(21226): at android.os.Handler.dispatchMessage(Handler.java:99)
E/AndroidRuntime(21226): at android.os.Looper.loop(Looper.java:137)
E/AndroidRuntime(21226): at android.app.ActivityThread.main(ActivityThread.java:4931)
E/AndroidRuntime(21226): at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime(21226): at java.lang.reflect.Method.invoke(Method.java:511)
E/AndroidRuntime(21226): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
E/AndroidRuntime(21226): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:558)
E/AndroidRuntime(21226): at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime(21226): Caused by: java.lang.ClassCastException: android.widget.TextView cannot be cast to com.handmark.pulltorefresh.library.PullToRefreshListView
E/AndroidRuntime(21226): at com.zhangdan.preferential.RecommendActivity.findViews(RecommendActivity.java:65)
E/AndroidRuntime(21226): at com.zhangdan.preferential.RecommendActivity.onCreate(RecommendActivity.java:58)
E/AndroidRuntime(21226): at android.app.Activity.performCreate(Activity.java:5008)
E/AndroidRuntime(21226): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
E/AndroidRuntime(21226): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2139)
E/AndroidRuntime(21226): ... 11 more
W/ActivityManager( 380):
RecommendActivity.java:
64 private void findViews() {
65 mFakeListView = (PullToRefreshListView)findViewById(R.id.refreshable_list);
66 mListView = mFakeListView.getRefreshableView();
67 }
xml: 1 <?xml version="1.0" encoding="utf-8"?>
2 <com.handmark.pulltorefresh.library.PullToRefreshListView
3 xmlns:android="http://schemas.android.com/apk/res/android"
4 xmlns:ptr="http://schemas.android.com/apk/res-auto"
5 android:id="@+id/refreshable_list"
6 android:layout_width="fill_parent"
7 android:layout_height="fill_parent"
8 android:cacheColorHint="#00000000"
9 android:fadingEdge="none"
10 android:listSelector="@android:color/transparent"
11 android:divider="@null"
12 android:paddingTop="5dip"
13 android:paddingBottom="5dip"
14 android:scrollbarStyle="outsideOverlay"
15 ptr:ptrMode="both" />
似乎正在发生的事情是,每当您在项目中添加/删除布局ID时,不知何原因,ant debug install
命令不能正确地重建所有受影响的代码,并导致另一个小部件的ID用于代替R.id.refreshable_list
的正确值,这反过来导致ClassCastException,当您的应用程序启动时。
以下是我的建议:
-
检查你所有的文件/文件夹都有有效的日期(也许他们中的任何一个都是将来的日期?)
-
将构建工具更新到最新版本(Android SDK, ant等)
-
您使用的是什么IDE ?检查它是否启用了自动构建,这可能会以某种方式干扰您的命令行构建。
希望这对你有帮助!
当它发生时,我只能使用ant clean &&Ant调试安装来修复它。但是重新编译一个漏洞项目需要双倍的时间,我不希望编译一个项目一分钟或更长时间。
运行ant clean debug install
可能会比单独运行这些操作更快。
您还可以尝试修改Ant脚本以删除bin/classes/
中的R.class
文件,而不是使用clean
命令。除了快速测试之外,我还没有尝试过这一点,因为对于一个合理规模的项目和一台像样的开发机器来说,这通常不是一个问题。然而,Joe的回答的核心是最后编译的R.class
文件与将要生成的R.java
文件不同步,而且无论出于何种原因,Ant的依赖机制并不总是能够解决这个问题。自己删除R.class
文件(例如,Linux上的find bin/classes -name R.class | xargs rm
)可以避免clean
,并且必须重新构建clean
删除的所有内容,但它将强制重新编译R.java
类。并且,在very light测试中,只要最终构建的APK工作,这似乎是有效的。俗话说,你的里程可能会有所不同。
请注意,如果你使用的是Android库项目——比如下拉刷新,会有多个R.class
文件(一个用于你的应用程序,一个用于每个库)。
有时候资源的错误是看不到的。你应该确保你的xml文件中没有任何错误。(com.handmark.pulltorefresh.library。)
之后你可以试试
1)删除R类2)清洁工程3)修复项目属性4)重建。