1

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

推荐Activity.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" />
4

3 回答 3

2

似乎正在发生的事情是,每当您在项目中添加/删除布局 ID 时,该ant debug install命令不会以某种方式正确重建所有受影响的代码,并导致使用另一个小部件的 ID 来代替 的正确值R.id.refreshable_list,其中turn 在您的应用程序启动时导致 ClassCastException。

以下是我的建议:

  • 检查您的所有文件/文件夹是否都有有效日期(也许其中任何一个都已过时?)

  • 将您的构建工具更新到最新版本(Android SDK、ant 等)。

  • 你用的是什么IDE?检查它是否启用了自动构建,这可能会以某种方式干扰您的命令行构建。

希望这可以帮助!

于 2013-03-23T06:34:02.960 回答
1

当它发生时,我只能使用 ant clean && ant debug install 来修复它。但是重新编译一个洞项目需要双倍的时间,我不希望编译一个项目一分钟或更长时间。

运行ant clean debug install可能比单独运行这些操作要快一些。

您也可以尝试修改您的 Ant 脚本以删除您的R.class文件中的文件bin/classes/,而不是使用该clean命令。除了刚才的快速测试之外,我还没有尝试过这个,因为通常这对于一个合理大小的项目和一个体面的开发机器来说不是问题。然而,Joe 回答的核心是最后编译的R.class文件与要生成的R.java文件不同步,并且无论出于何种原因,Ant 的依赖机制并不总是能够解决这个问题。自己删除R.class文件(例如,find bin/classes -name R.class | xargs rm在 Linux 上)可以让您避免clean并不得不重新构建所有被clean清除的内容,但它会强制重新编译R.java类。而且,在非常轻度测试,这似乎工作,只要生成的构建 APK 工作。俗话说,你的里程可能会有所不同。

请注意,如果您使用的是 Android 库项目——例如 Pull-to-Refresh,将会有多个R.class文件(一个用于您的应用,一个用于每个库)。

于 2013-03-24T15:01:43.603 回答
0

有时看不到资源的错误。您应该确保您的 xml 文件中没有任何错误。(com.handmark.pulltorefresh.library.PullToRefreshListView 是正确的包吗?)

之后可以试试

1)删除您的 R 类 2)清理项目 3)修复项目属性 4)重建。

于 2013-03-26T15:43:09.723 回答