Android总是抛出ClassCastException



我从命令行构建了我的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)重建。

相关内容

  • 没有找到相关文章