Multithreading 以多线程方式显示来自web url的图像
我有52个来自web URL的图像。我想在多线程过程中显示这些图像 谁能告诉我这是怎么可能的 我实现了下面的代码,但它不工作Multithreading 以多线程方式显示来自web url的图像,multithreading,blackberry,Multithreading,Blackberry,我有52个来自web URL的图像。我想在多线程过程中显示这些图像 谁能告诉我这是怎么可能的 我实现了下面的代码,但它不工作 for (int i = 0; i <total_data; i++) { GetBitmapClass getBitmapClass=new GetBitmapClass(i, image_path[i]); if(Thread.activeCount()>14) { //S
for (int i = 0; i <total_data; i++) {
GetBitmapClass getBitmapClass=new GetBitmapClass(i, image_path[i]);
if(Thread.activeCount()>14)
{
//System.out.println("Size "+pending_thread.size());
pending_thread.addElement(getBitmapClass);
}else
{
getBitmapClass.start();
}
}
//Thread class
class GetBitmapClass extends Thread
{
int index;
String url;
public GetBitmapClass(int index,String url)
{
this.index=index;
this.url=url;
}
public void run() {
// TODO Auto-generated method stub
StreamConnection stream = null;
InputStream in = null;
if(Thread.activeCount()>14)
{
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
System.out.println("Thread "+index+" Started \n count= "+Thread.activeCount());
try {
//stream = (StreamConnection) Connector.open(url+";deviceside=true;");
stream = (StreamConnection) Connector.open(url+";interface=wifi");
in = stream.openInputStream();
}
catch (Exception e) {
}
byte[] data = new byte[1024];
try {
DataBuffer db = new DataBuffer();
int chunk = 0;
while (-1 != (chunk = in.read(data))) {
db.write(data, 0, chunk);
}
in.close();
data = db.getArray();
} catch (Exception e) {
}
EncodedImage jpegPic = EncodedImage.createEncodedImage(data, 0,
data.length);
Bitmap bm = jpegPic.getBitmap();
bmp[index]=bm;
UiApplication.getUiApplication().invokeLater (new Runnable() {
public void run()
{
bitmapFields[index].setBitmap(bmp[index]);
gridFieldManager.add(bitmapFields[index]);
if((pending_thread.size()>0))
{
GetBitmapClass thread1=(GetBitmapClass)pending_thread.elementAt(0);
try
{
thread1.start();
pending_thread.removeElementAt(0);
}
catch (Exception e) {
// TODO: handle exception
System.out.print("Thread Not Started");
}
System.out.println("Size Reduce"+pending_thread.size());
}
System.out.print("Thread Completed"+index);
}
});
}
for(int i=0;i 14)
{
//System.out.println(“Size”+pending_thread.Size());
挂起的线程addElement(getBitmapClass);
}否则
{
getBitmapClass.start();
}
}
//螺纹类
类GetBitmapClass扩展线程
{
整数指数;
字符串url;
公共GetBitmapClass(int索引,字符串url)
{
这个。索引=索引;
this.url=url;
}
公开募捐{
//TODO自动生成的方法存根
StreamConnection-stream=null;
InputStream in=null;
if(Thread.activeCount()>14)
{
试一试{
睡眠(1000);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
System.out.println(“线程”+索引+”已启动\n count=“+Thread.activeCount());
试一试{
//stream=(StreamConnection)Connector.open(url+“deviceside=true;”);
流=(流连接)连接器。打开(url+“接口=wifi”);
in=stream.openInputStream();
}
捕获(例外e){
}
字节[]数据=新字节[1024];
试一试{
DataBuffer db=新的DataBuffer();
int chunk=0;
而(-1!=(chunk=in.read(data))){
db.write(数据,0,块);
}
in.close();
data=db.getArray();
}捕获(例外e){
}
EncodedImage jpegPic=EncodedImage.createEncodedImage(数据,0,
数据(长度);
位图bm=jpegPic.getBitmap();
bmp[index]=bm;
UiApplication.getUiApplication().invokeLater(新的Runnable()){
公开募捐
{
位图字段[index].setBitmap(bmp[index]);
add(位图字段[索引]);
如果((挂起的线程大小()>0))
{
GetBitmapClass线程1=(GetBitmapClass)挂起线程.elementAt(0);
尝试
{
thread1.start();
挂起的线程removeElementAt(0);
}
捕获(例外e){
//TODO:处理异常
系统输出打印(“线程未启动”);
}
System.out.println(“Size Reduce”+pending_thread.Size());
}
系统输出打印(“线程完成”+索引);
}
});
}
}
提前感谢。尝试同时运行多个线程对BB来说是个坏主意。这不是桌面。通常情况下,你应该避免运行多个沉重的后台线程,否则你可能会将你的主UI线程降低到用户会停止使用你的应用程序并称之为“迟缓”的程度。你的线程很重-它们调整图像大小、进行网络连接、操作位图。为了解决这个问题,您需要创建一个
Runnable
任务列表,并在唯一的后台线程上执行它们。根据我的经验,在BB上按顺序执行任务比同时运行所有任务更有效。同时运行多个线程对BB来说是个坏主意。这不是桌面。通常情况下,你应该避免运行多个沉重的后台线程,否则你可能会将你的主UI线程降低到用户会停止使用你的应用程序并称之为“迟缓”的程度。你的线程很重-它们调整图像大小、进行网络连接、操作位图。为了解决这个问题,您需要创建一个Runnable
任务列表,并在唯一的后台线程上执行它们。根据我的经验,在BB上按顺序执行任务比一次运行所有任务更有效。我忘了关闭流连接。需要关闭流连接。我忘了关闭流连接。需要关闭流连接。这里发生了什么。。看来应该行得通。检查你的防火墙。然后给我正确的信息它是如何运行的。这个代码在黑莓模拟器中正常工作,但在黑莓设备中最多加载32个图像。。我不知道这个设备到底发生了什么。所以给我一些建议。检查这可能是图像大小的问题。如果图像大小很大,则可能会导致内存问题。因此,它将抛出一些内存异常。您是否在运行时收到任何此类异常??不,尼尔,我没有得到任何类型的运行时异常。我花了一些时间用适当的代码标记重新格式化您的问题。我认为您没有准确地发布代码段。例如:您真的在For循环中声明了GetBitmapClass吗?我建议您使用适当的标记(大括号按钮{}允许您发布代码)编辑您的问题,并确保发布所有相关的代码片段。看起来,您的代码逻辑永远不会提取挂起的线程