我从命令行构建了我的android项目,并使用ant debug install
进行编译。但是在我将一个名为Android-PullToRefresh的外部项目导入到我的项目后,我的项目在运行时变得异常。有时我在xml布局文件中添加新id或删除id后,我的编译进展顺利但是当应用程序开始运行时,它会抛出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" />
答案 0 :(得分:2)
似乎正在发生的事情是,无论何时在项目中添加/删除布局ID,ant debug install
命令都会无法正确重建所有受影响的代码,并导致另一个窗口小部件的ID被使用到位R.id.refreshable_list
的正确值,在您的应用启动时会导致ClassCastException。
以下是我的建议:
检查您的所有文件/文件夹是否都有有效日期(将来可能会有任何日期?)
将构建工具更新到最新版本(Android SDK,ant等)。
您使用的是什么IDE?检查它是否启用了自动构建,这可能会以某种方式干扰您的命令行构建。
希望这有帮助!
答案 1 :(得分:1)
当它发生时,我只能使用ant clean&amp;&amp; ant debug install来修复它。但重新编译一个洞项目需要花费两倍的时间,我不希望编译一分钟或更长时间的项目。
运行ant clean debug install
的速度可能比分别运行这些操作的速度快。
您还可以尝试修改Ant脚本以删除R.class
中的bin/classes/
文件,而不是使用clean
命令。我刚才没有尝试过快速测试,因为通常这对于合理大小的项目和体面的开发机器来说不是问题。但是,Joe的回答的核心是最后编译的R.class
文件与要生成的R.java
文件不同步,无论出于何种原因,Ant的依赖机制并不总是选择这个起来。自己删除R.class
文件(例如,Linux上的find bin/classes -name R.class | xargs rm
)可以避免clean
并且必须重建clean
消除的所有内容,但它会强制重新编译R.java
个班级。并且,在非常光测试中,这似乎可行,只要生成的APK生效。俗话说,你的里程可能会有所不同。
请注意,如果您使用的是Android库项目(例如Pull-to-Refresh),则会有多个R.class
个文件(一个用于您的应用,一个用于每个库)。
答案 2 :(得分:0)
有时资源的错误无法看到。您应该确保xmls中没有任何错误。 (com.handmark.pulltorefresh.library.PullToRefreshListView是正确的包吗?)
您可以尝试
1)删除你的R类 2)清洁项目 3)修复项目属性 4)重建。