Android总是抛出ClassCastException

时间:2013-03-20 13:51:22

标签: android ant

我从命令行构建了我的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" />

3 个答案:

答案 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)重建。