在Blackberry中使用自定义列表字段时,线程异常太多

时间:2011-10-24 13:39:39

标签: blackberry

我正在使用blackberry中的表行管理器开发自定义列表字段。它显示来自Web服务的项目列表。当我点击项目时它会转到其他屏幕。但是我得到太多的线程异常。在一段时间之后我当我点击item时,我得到太多线程异常。然后我检查线程是否通过使用debug创建。然后我发现显示每个项目它创建单独的线程。我怎么能解决这个问题请帮助这里是我的自定义列表字段班级

class LabelListField extends ListField implements ListFieldCallback 
{
    private Vector mValues;
    private Vector mRows;
    DynamicImages images;
    int[] intColor=new int[500];
    int i=0;
    int j=0,position;
    static int value1=0;
    String key;
    String[] col;
    public LabelListField(Vector values,int p,String key) {
        super(0);
        setRowHeight(70);
        setCallback(this);
        position=p;
        mValues = values;
        this.key=key;
        fillListWithValues(values);
        images=new DynamicImages();
        scheduleInvalidate();
    }

    private void scheduleInvalidate() {
        Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {
            public void run() {
                invalidate();
            }
        }, 0, 100);
    }

    private void fillListWithValues(Vector values) {
        mRows = new Vector();
        for (;i< values.size();i++) {

           TableRowManager row = new TableRowManager();
           String value = (String) values.elementAt(i);
            ListLabel valueLabel = new ListLabel(this,i,value);
            if(Display.getWidth()==480)
            {
            valueLabel.setFont(Utility.getBigFont(16));
            }
            else
            {
            valueLabel.setFont(Utility.getBigFont(12)); 
            }
            row.add(valueLabel);

            mRows.addElement(row);
        }

        setSize(mRows.size());
    }

    private class TableRowManager extends Manager {
        public TableRowManager() {
            super(0);
        }

        public void drawRow(Graphics g, int x, int y, 
            int width, int height) {
            layout(width, height);
            setPosition(x, y);
            g.pushRegion(getExtent());
            paintChild(g, getField(0));
            Bitmap line=Bitmap.getBitmapResource(images.lightline);
            g.drawBitmap(0,0,line.getWidth(),line.getHeight(),line,0,0);
            g.popContext();
        }
    protected void sublayout(int width, int height) {
            int fontHeight = Font.getDefault().getHeight();
            int preferredWidth = getPreferredWidth();
            Field field = getField(0);
            layoutChild(field, preferredWidth,fontHeight + 1);
            if(((ListLabel)field).getText().length()>110)
            {
            setPositionChild(field, 5,10);
            }
            else if(((ListLabel)field).getText().length()>55)
            {
             setPositionChild(field,5,20);
            }
            else if(((ListLabel)field).getText().length()<55)
            {
             setPositionChild(field,5,30);
            }
            //field = getField(1);
            //layoutChild(field,18,24);
            //setPositionChild(field,250,30);
            setExtent(getPreferredWidth(), getPreferredHeight());
        }

        public int getPreferredWidth() {
            return Display.getWidth();
        }

        public int getPreferredHeight() {
            return getRowHeight();
        }
    }

    public void drawListRow(ListField listField, Graphics g, 
            int index, int y, int width) {


        String val=HomeScreenIcons.colorstable.get(key).toString();
        col=StringToken.split(val,"||");
        if (g.isDrawingStyleSet(Graphics.DRAWSTYLE_FOCUS))
        {
        LabelListField list = (LabelListField) listField;
        g.setColor(0xC0C0C0);
        g.fillRect(0,y+0,480,list.getRowHeight());
        if(col[index].equals("1"))
        {

         g.setColor(0x004D7B);  
        }
        else
        {

             g.setColor(Color.GRAY);    

        }
        TableRowManager rowManager = (TableRowManager) list.mRows
                .elementAt(index);

        rowManager.drawRow(g,0,y,width,list.getRowHeight());
        }
        else
        {
            if(col[index].equals("1"))
            {

            g.setColor(0x004D7B);   
            }
            else
            {
            g.setColor(Color.GRAY); 

            }
            LabelListField list = (LabelListField) listField;
            TableRowManager rowManager = (TableRowManager) list.mRows
                    .elementAt(index);
            rowManager.drawRow(g,0,y,width,list.getRowHeight());
        }

    }

    public Object get(ListField list, int index) {
        return mValues.elementAt(index);
    }

    public int indexOfList(ListField list, String prefix, int start) {
        for (int x = start; x < mValues.size(); ++x) {
            String value = (String) mValues.elementAt(x);
            if (value.startsWith(prefix)) {
                return x;
            }
        }
        return -1;
    }

    public int getPreferredWidth(ListField list) {
        return Display.getWidth();
    }

    class ListLabel extends LabelField {
        int mIndex = -1;
        String text;
        int[] color=new int[500];
        public ListLabel(LabelListField list, int index, String text) {
            super(text);
            this.text=text;
            mIndex = index;
            System.out.println("position is"+position);

        }

         public int getPreferredWidth() { 
             return Display.getWidth()-80; 
         } 

         protected void layout(int maxWidth,int maxHeight) {
             super.layout(getPreferredWidth(),maxHeight);
             setExtent(getPreferredWidth(), getHeight());
         }
    protected boolean navigationClick(int status, int time) {
                 fieldChangeNotify(0);
                 return true;
               }
               protected void fieldChangeNotify(int context){
                 if(context == 0){
                   try {
                     this.getChangeListener().fieldChanged(this, context);
                   } catch (Exception e){}
                 }
               }
    }
    protected boolean trackwheelClick(int status, int time)
    {
        return true;
    }
}

2 个答案:

答案 0 :(得分:1)

无用调用scheduleInvalidate方法。删除scheduleInvalidate()它可以正常使用

答案 1 :(得分:1)

koti,添加到你自己的答案 - 我的一个BB应用程序还需要为列表的每一行触发线程。

BlackBerry只能有几个线程。我建议创建一个任务工作线程,并在其上排队任务。这样你就可以运行许多后台任务,但它们只在一个线程上运行。

在您的情况下,另一个选项是只运行一个Timer线程,并列出行。然后,该1个线程可以在特定时间使每一行无效。这比为每行设置一个新的定时器线程更好。