Отображение MapField внутри приложения выдает IllegalArgumentException Bitmap - слишком большое исключение - PullRequest
0 голосов
/ 02 апреля 2011

Я пытаюсь добавить поле карты в своем приложении Blackberry, но я получаю исключение при переходе к этому экрану, говоря IllegalArgumentException (Bitmap слишком большой).Любая идея?

Код:

package com.quadrazol.bb.fpg.screens.maps;

import net.rim.device.api.lbs.maps.ui.MapField;
import net.rim.device.api.lbs.maps.model.MapDataModel;
import net.rim.device.api.lbs.maps.model.MapLocation;
import net.rim.device.api.lbs.maps.model.Mappable;
import net.rim.device.api.system.Display;
import net.rim.device.api.ui.Color;
import net.rim.device.api.ui.Graphics;
import net.rim.device.api.ui.component.SeparatorField;
import net.rim.device.api.ui.container.VerticalFieldManager;

import com.quadrazol.bb.fpg.screens.TabScreen;
import com.quadrazol.bb.fpg.util.DataHelper;
import com.quadrazol.bb.fpg.util.UIHelper;

public class FindAPlannerScreen extends TabScreen {

    private MapField basicMapField;

    public FindAPlannerScreen() {
        super();
        VerticalFieldManager mgr = new VerticalFieldManager(
                VerticalFieldManager.USE_ALL_HEIGHT
                        | VerticalFieldManager.USE_ALL_WIDTH
                        | VerticalFieldManager.NO_VERTICAL_SCROLL) {
            public void paint(Graphics graphics) {
                graphics.setBackgroundColor(Color.BLACK);
                graphics.clear();
                super.paint(graphics);
            }
        };
        add(mgr);
        mgr.add(UIHelper.generateHeader());
        mgr.add(new SeparatorField() {
            public void paint(Graphics graphics) {
                graphics.setColor(Color.WHITE);
                super.paint(graphics);
            }

        });

        VerticalFieldManager mainScrollView = UIHelper.generateMainScrollView();
        basicMapField = new MapField(mainScrollView.getWidth()-6,(int) (mainScrollView.getHeight()*.90));
        MapDataModel model = basicMapField.getModel();
        Mappable[] plannerDetails = DataHelper.fetchPlannerDetails();
        if (plannerDetails != null) {
            model.addAll(plannerDetails);
        }

        mainScrollView.add(basicMapField);
        mgr.add(mainScrollView);

        mgr.add(UIHelper.generateTabBarForScreen(UIHelper.TAB_MAP));
    }
}

Исключение:

[0.0] ViewEngine$RenderingEngine:unknown exception occured, IllegalArgumentException(Bitmap is too large)
[0.0] IllegalArgumentException
[0.0] Bitmap is too large
[0.0] net_rim_cldc-10(4C48DD41)
[0.0]  Bitmap
[0.0]  <init>
[0.0]  0x8778
[0.0] net_rim_cldc-10(4C48DD41)
[0.0]  Bitmap
[0.0]  <init>
[0.0]  0x8628
[0.0] net_rim_cldc-10(4C48DD41)
[0.0]  Bitmap
[0.0]  <init>
[0.0]  0x8609
[0.0] net_rim_cldc-10(4C48DD41)
[0.0]  Bitmap
[0.0]  <init>
[0.0]  0x85ED
[0.0] net_rim_cldc-10(4C48DD41)
[0.0]  Bitmap
[0.0]  <init>
[0.0]  0x859E
[0.0] net_rim_bb_maps_api-4(4C48E231)
[0.0]  ViewEngine
[0.0]  generateContext
[0.0]  0x6457
[0.0] net_rim_bb_maps_api-4(4C48E231)
[0.0]  ViewEngine$RenderingEngine
[0.0]  <private>
[0.0]  0x65F2
[0.0] net_rim_bb_maps_api-4(4C48E231)
[0.0]  ViewEngine$RenderingEngine
[0.0]  run
[0.0]  0x6507

PS: Я также запутался между использованием net.rim.device.api.lbs.maps.ui.MapField и net.rim.device.api.lbs.MapField

Обновление:

Я пробовал согласно вашему предложению, но все равно выдает ту же ошибку.Я заметил одну странную вещь.Обновленный код выглядит следующим образом:

int displayWidth = Display.getWidth();
        int displayHeight = Display.getHeight();
        basicMapField = new MapField(displayWidth / 2, displayHeight / 2);
        System.out.println("Display Dimen:"+displayHeight+" "+displayWidth);
        System.out.println("Map Dimen:"+basicMapField.getHeight()+" "+basicMapField.getWidth());

Но в логах я не вижу установленных параметров.Логи показывают:

[0.0] Display Dimen:480 360
[0.0] Map Dimen:0 0

1 Ответ

1 голос
/ 02 апреля 2011

IllegalArgumentException: Bitmap is too large означает, что где-то внутри внутреннего кода RIM была попытка создать действительно большой Bitmap экземпляр.Что такое «действительно большой», знает только RIM - к сожалению, нет четкой документации по этому вопросу.

Таким образом, общее правило, чтобы не попадать в эту проблему, это каким-то образом контролировать / ограничивать размеры экземпляра Bitmap.Обратите внимание, что для решения этой проблемы вам даже не нужно явно создавать экземпляр Bitmap, так как в вашем случае достаточно просто создать некоторые другие вещи, которые подразумевают использование Bitmap.Определенно, когда вы показываете / рисуете / рисуете что-то, тогда используется Bitmap, даже если вы не создаете его явно.

Из кода, который вы разместили, я подозреваю, что эта строка может вызвать проблему:

basicMapField = new MapField(mainScrollView.getWidth()-6,
                        (int) (mainScrollView.getHeight()*.90));

Знаете ли вы, какие аргументы фактически передаются конструктору MapField?Чтобы проверить это предположение, вы можете попробовать это:

int displayWidth = Display.getWidth();
int displayHeight = Display.getHeight();
basicMapField = new MapField(displayWidth / 2, displayHeight / 2);
...