Почему я не могу вызывать статические методы в моем приложении Android
Всякий раз, когда я делаю, независимо от того, откуда я его вызываю, приложение вылетает с IllegalStateException: не может выполнить метод действия. У меня сейчас только несколько классов, и все они в одном пакете, включая класс со статическими методами, вызывающими сбой.
Есть ли какие-то проблемы или особые соображения, которые следует учитывать при вызове статических методов в приложении для 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. Кажется, есть некоторый конфликт с API Dropbox, который я использую в одном из статических методов, но который не вызывается до сбоя приложения. Следующее - вывод ошибок после того, как я изменил 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)
ImageManager
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) {
...
...
1 ответ
Чтобы это исправить, я фактически закончил тем, что разбил метод downloadImage (и пару других) из класса ImageManager на их собственный отдельный нестатический класс. ImageManager все еще статический класс, но он не вызывает никаких проблем, и приложение не падает. Итак, похоже, что проблема была в вызовах API Dropbox, которые я делал из статического контекста, но я не знаю, почему именно. Я достаточно доволен тем, что у меня есть сейчас.