【问题标题】:Why can't I call static methods anywhere in my Android app为什么我不能在我的 Android 应用程序的任何地方调用静态方法
【发布时间】:2014-01-09 19:09:03
【问题描述】:

每当我这样做时,无论我从哪里调用它,应用程序都会因 IllegalStateException:无法执行 Activity 的方法而崩溃。目前我只有几个类,它们都在同一个包中,包括具有导致崩溃的静态方法的类。

在 Android 应用中调用静态方法时,是否应考虑一些问题或特殊注意事项?

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
    ImageManager.initImageManager(this);  // crash
}

编辑
抱歉,错误实际上是 VerifyError。我在其中一种静态方法中使用的 Dropbox API 似乎存在一些冲突,但在应用程序崩溃之前没有调用它。以下是我将 ImageManager 更改为完全静态的类后的错误输出,我认为它应该是。 ImageManager 代码如下:

01-09 19:23:51.356: W/dalvikvm(32032): VFY: unable to find class referenced in signature (Lcom/dropbox/client2/DropboxAPI;)
01-09 19:23:51.357: I/dalvikvm(32032): Could not find method com.dropbox.client2.DropboxAPI.getFile, referenced from method rfynes.moviebrowser.ImageManager.downloadImage
01-09 19:23:51.357: W/dalvikvm(32032): VFY: unable to resolve virtual method 5140: Lcom/dropbox/client2/DropboxAPI;.getFile (Ljava/lang/String;Ljava/lang/String;Ljava/io/OutputStream;Lcom/dropbox/client2/ProgressListener;)Lcom/dropbox/client2/DropboxAPI$DropboxFileInfo;
01-09 19:23:51.357: D/dalvikvm(32032): VFY: replacing opcode 0x6e at 0x0063
01-09 19:23:51.358: W/dalvikvm(32032): VFY: unable to resolve exception class 735 (Lcom/dropbox/client2/exception/DropboxServerException;)
01-09 19:23:51.358: W/dalvikvm(32032): VFY: unable to find exception handler at addr 0x8b
01-09 19:23:51.358: W/dalvikvm(32032): VFY:  rejected Lrfynes/moviebrowser/ImageManager;.downloadImage (Ljava/lang/String;Ljava/io/File;Ljava/lang/String;Lcom/dropbox/client2/DropboxAPI;)V
01-09 19:23:51.358: W/dalvikvm(32032): VFY:  rejecting opcode 0x0d at 0x008b
01-09 19:23:51.358: W/dalvikvm(32032): VFY:  rejected Lrfynes/moviebrowser/ImageManager;.downloadImage (Ljava/lang/String;Ljava/io/File;Ljava/lang/String;Lcom/dropbox/client2/DropboxAPI;)V
01-09 19:23:51.358: W/dalvikvm(32032): Verifier rejected class Lrfynes/moviebrowser/ImageManager;
01-09 19:23:51.358: D/AndroidRuntime(32032): Shutting down VM
01-09 19:23:51.358: W/dalvikvm(32032): threadid=1: thread exiting with uncaught exception (group=0x41672898)
01-09 19:23:51.361: E/AndroidRuntime(32032): FATAL EXCEPTION: main
01-09 19:23:51.361: E/AndroidRuntime(32032): java.lang.VerifyError: rfynes/moviebrowser/ImageManager
01-09 19:23:51.361: E/AndroidRuntime(32032):    at rfynes.moviebrowser.MainActivity.onCreate(MainActivity.java:16)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at android.app.Activity.performCreate(Activity.java:5150)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2192)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2288)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at android.app.ActivityThread.access$600(ActivityThread.java:148)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1273)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at android.os.Handler.dispatchMessage(Handler.java:99)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at android.os.Looper.loop(Looper.java:137)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at android.app.ActivityThread.main(ActivityThread.java:5222)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at java.lang.reflect.Method.invokeNative(Native Method)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at java.lang.reflect.Method.invoke(Method.java:525)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-09 19:23:51.361: E/AndroidRuntime(32032):    at dalvik.system.NativeStart.main(Native Method)

图像管理器

public class ImageManager {

private File posterDir, backdropDir;

public static void initImageManager(Activity activity) {
    posterDir = activity.getDir("poster", Context.MODE_PRIVATE);
    backdropDir = activity.getDir("backdrop", Context.MODE_PRIVATE);
}
    ...
    ...
    public static void downloadImage(String movieId, File imageDir, String imageType, DropboxAPI<AndroidAuthSession> dropbox) {
    ...
    ...

【问题讨论】:

  • 请发布堆栈跟踪,这会有所帮助。
  • 另外,你能包括导致问题的静态方法吗?
  • 您确定这是一般静态方法的问题,还是静态方法本身的问题?
  • @RTF 永远不要保持对活动上下文的强引用,因为这可能会泄漏活动的视图层次结构。应用程序上下文可用于访问共享首选项,而没有这种危险。此外,如果您需要与 Activity 进行通信,您可以在您的 Activity 中注册一个 BroadcastReceiver,并使用您的应用上下文将广播发送回您的 Activity 以发送 BC。此外,您可以(尽管它不受欢迎,但如果您正确处理它并没有真正的危险)使用 Wea​​kReference 来保留对您的活动的引用,这不会阻止垃圾收集。
  • 或者定义Interfaces(这在Android中很常见——想想onClickListener——这是一个接口)。它们是在 Activity 中将 UI 更新保持在它们所属的位置的好方法。

标签: java android static-methods


【解决方案1】:

为了解决这个问题,我实际上最终将 ImageManager 类中的 downloadImage 方法(以及其他几个方法)拆分为它们自己的独立非静态类。 ImageManager 现在仍然是一个静态类,但它没有引起任何问题,应用程序也没有崩溃。因此,问题似乎是我从静态上下文中进行的 Dropbox API 调用,但我不知道具体原因。不过,我对我现在所拥有的感到很满意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 2019-03-11
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    相关资源
    最近更新 更多