我正在使用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;
}
}
答案 0 :(得分:1)
无用调用scheduleInvalidate
方法。删除scheduleInvalidate()
它可以正常使用
答案 1 :(得分:1)
koti,添加到你自己的答案 - 我的一个BB应用程序还需要为列表的每一行触发线程。
BlackBerry只能有几个线程。我建议创建一个任务工作线程,并在其上排队任务。这样你就可以运行许多后台任务,但它们只在一个线程上运行。
在您的情况下,另一个选项是只运行一个Timer线程,并列出行。然后,该1个线程可以在特定时间使每一行无效。这比为每行设置一个新的定时器线程更好。