命中ClassCastException

时间:2012-07-12 02:50:20

标签: blackberry popup classcastexception

我打电话给这个班级PopupScreen

public class Custom_LoadingScreen extends PopupScreen {
private VerticalFieldManager vfm;
private Util_AnimateGifField anmtFldCycle = null;
private GIFEncodedImage gifImgCycle;

public Custom_LoadingScreen() {
    super(new VerticalFieldManager());
    Background bg = BackgroundFactory.createSolidTransparentBackground(
            Color.BLACK, 190);
    setBackground(bg);
    setBorder(BorderFactory.createSimpleBorder(new XYEdges(),
            Border.STYLE_TRANSPARENT));

    gifImgCycle = (GIFEncodedImage) GIFEncodedImage
            .getEncodedImageResource("LoadingSpinner.gif");
    anmtFldCycle = new Util_AnimateGifField(gifImgCycle,
            Field.FIELD_HCENTER);

    vfm = new VerticalFieldManager(USE_ALL_WIDTH) {
        protected void sublayout(int maxWidth, int maxHeight) {
            super.sublayout(Display.getWidth(), Display.getHeight());
            setExtent(Display.getWidth(), Display.getHeight());
        }
    };
    int padding = (Display.getHeight() - 16) / 2;
    if (padding > 0) {
        anmtFldCycle.setPadding(padding, 0, 0, 0);
    }
    vfm.add(anmtFldCycle);
    add(vfm);
}

//public void Popupscreen() {
    //Main.getUiApplication().popScreen(this);
//}

public boolean keyDown(int keycode, int status) {
    if (Keypad.key(keycode) == Keypad.KEY_ESCAPE) {
        Main.getUiApplication().popScreen(this);
        return true;
    }
    return super.keyDown(keycode, status);
}
}

在按钮中,我按下它然后转到下一个屏幕。

financebtn = new Custom_ButtonField(finance, financeactive,
            financeactive) {
        protected boolean navigationClick(int status, int time) {
            Main.getUiApplication().pushScreen(new Custom_LoadingScreen());
            Main.getUiApplication().invokeLater(new Runnable() {
                public void run() {
                //  Main.getUiApplication().popScreen();
                    Main.getUiApplication().pushScreen(
                            new Main_NewsDetail());
                }

            }, 1 * 1000, false);

            return true;
        }
    };
    add(financebtn);

结果给了我Uncaught:ClassCastException。我可以调用另一个类似于custom_loadingscreen的类也弹出屏幕。它工作正常。

我也试过在另一个按钮中调用这个类但仍然存在同样的问题。

1 个答案:

答案 0 :(得分:5)

如果您查看Custom_LoadingScreen代码,那么您只有一个地方可以进行演员投放:

gifImgCycle = (GIFEncodedImage) GIFEncodedImage
        .getEncodedImageResource("LoadingSpinner.gif");

所以,这是一个开始寻找的好地方。如果你谷歌“BlackBerry GIFEncodedImage ClassCastException”,你会发现这个帖子:

http://supportforums.blackberry.com/t5/Java-Development/GIFEncodedImage-in-BlackBerry-OS7/td-p/1228959

问题在于,为了优化,BlackBerry喜欢将图像转换为PNG格式,而大多数智能手机最适合这种格式。所以,这里发生的是你的GIF图像实际上被转换为PNG图像。因此,当您调用getEncodedImageResource()方法时,您要返回的对象实际上可能是PNGEncodedImage类型,而不是GIFEncodedImage,并且您获得了异常。偷偷摸摸,是吗?

你可以通过几种方式解决它。

  1. Blackberry_App_Descriptor.xml 文件中,您可以取消选中指定图片转换为PNG的设置(构建标签 - > 将图片文件转换为PNG
  2. 您可以通过将GIF文件重命名为 LoadingSpinner.agif 来欺骗构建系统。该工具集无法识别.agif扩展名,因此不会尝试转换它。当然,如果你这样做,记住在加载它时也要更改Java代码中的文件名。
  3. 您可以更改代码以使用PNGEncodedImage,或者像这样测试对象:
  4. EncodedImage img = EncodedImage.getEncodedImageResource("LoadingSpinner.gif");
    if (img instanceof GIFEncodedImage) {
       // cast to GIFEncodedImage
    } else if (img instanceof PNGEncodedImage) {
       // cast to PNGEncodedImage
    }
    

    对于所有非PNG图像,数字(1)将失去非PNG到PNG的转换优化,而不仅仅是这个。

    数字(2)确实看起来有点难看。但是,这样做的好处是,您可以仅为这一个图像禁用此行为。如果您的大部分图像都不是PNG图像,那么让BlackBerry为您优化其他图像可能很有价值。但是,也许这个人需要成为GIF。所以,#2允许你作为一个特例来处理这个。

    我只是猜测这张图片可能是动画 GIF?是对的吗?如果是这样,您可能希望将其保留为GIF,因此您不希望使用数字(3),这样可以将其转换为PNG,并将其用作PNG。