当连接运行时,如何在黑莓上重新绘制部分屏幕?

发布于 10-02 19:27 字数 3978 浏览 7 评论 0原文

我有两个问题。

第一个是关于更新 UI,第二个是当我尝试连接到相机以获取 mjpeg 流并运行 getResponseCode() 时,应用程序会锁定在那里。 MDS 显示大量数据传输。

我有一些类,例如...:

Http extends Thread {
  public abstract String getUrl();
  public abstract String getBase64Encode();
  public abstract void onReturn(int responseCode, InputStream is,int lenght);
  protected abstract void onError(Exception e);
}

CameraHttp 扩展 Http 和 MjpegHttp 扩展 CameraHttp。

http 连接到一个 URL,该 URL 是 jpeg 或 mjpeg 相机地址。

我有一个相机课。它使用重写的方法 mjpegconnection.go(); 启动连接。 我在 ViewCam 屏幕上还有一个静态位图,它扩展了主屏幕。

启动后:

url = getUrl();
queryString = encodeURL(queryString);
byte postmsg[] = queryString.getBytes("UTF-8");
httpConnection = (HttpConnection) Connector.open(url
    + ";deviceside=false", Connector.READ_WRITE);
httpConnection.setRequestMethod(HttpConnection.GET);
httpConnection.setRequestProperty("Authorization", getBase64Encode());
os = httpConnection.openDataOutputStream(); 

for (int i = 0; i < postmsg.length; i++) {
    os.write(postmsg[i]);
}
{
     if (!cancel) {
         System.out.println(httpConnection.getURL()+ 
             " *****"+httpConnection.getPort());
         System.out.println("onreturn oncesi"
             + httpConnection.getResponseCode());
         onReturn(httpConnection.getResponseCode(), httpConnection
             .openInputStream(),(int) httpConnection.getLength());

         System.out.println("onreturn sornrası");
     }
     os.close();
     httpConnection.close();
}
} catch (Exception e) {
    System.out.println("hata " + e.getMessage());
    try {
        httpConnection.close();
        Thread.sleep(60);
    } catch (Exception ie) {
}
onError(e);
}

执行某些操作后

 // decides mjpeg-jpeg stream
 // if it is mjpeg, direct to parser,
 // else it sets image with setImage() and return to connection with go();
 public void parse(InputStream is, int lenght) {
     try {
         if (!type.isMjpegStream()) {
             setImage(is, lenght);
             System.gc();
             StaticVar.ActiveCam.setConnected(true);
         } else { 
             if (parser == null) {
             parser = new JpegParser(is, this);
         } else {
             parser.setInputSteam(is, this);
         }
         parser.parse();
         is.close();
     }
     } catch (Exception e) {
     } 
}

 public void setImage(InputStream is, int lenght) {
     byte[] raw = new byte[lenght];
     try {
         is.read(raw);
         currentImage = Bitmap.createBitmapFromBytes(raw, 0, raw.length, 1);
         ViewCam.ViewCam=currentImage;       //static var.
     } catch (IOException e) {
         System.out.println("catche***********");
         // TODO Auto-generated catch block
         e.printStackTrace();
     }
 }

如何重新绘制屏幕以显示位图?

还有我的 ViewCam

public class ViewCam extends MainScreen {
Header header;
String headerString;
public static Bitmap ViewCam;// cam image shows
private static Thread My;// runs connection

void OnStart() {
    My = new Thread() {
        public void run() {
            System.out.println("ONSTART");
            StaticVar.ActiveCam.go();
        };
    };
    My.start();
    Bitmap bitmap = Bitmap.getBitmapResource("res/main.png");
    Bitmap bmp2 = ResizeImage.resizeBitmap(bitmap, Display.getWidth(),
            Display.getHeight());
    Background bg = BackgroundFactory.createBitmapBackground(bmp2);
    this.setBackground(bg);
    this.getMainManager().setBackground(bg);


}


public ViewCam() {
    StaticVar.ActiveCam.getIp();

    OnStart();

    headerString ="Cam View";
    header = new Header("res/bartop.png", headerString, 0);
    add(header);

    ViewCam = Bitmap.getBitmapResource("res/spexco_splash.png");
    ViewCam = ResizeImage.bestFit(ViewCam, Display.getWidth(), Display
            .getHeight());
    BitmapField bf = new BitmapField(ViewCam);
    add(bf);
}
}

I have two questions.

The first is about updating the UI, the second is when I try to connect to the camera to get a mjpeg stream and run getResponseCode(), the app locks there. The MDS shows a lot of data transferring.

I have some classes like ....:

Http extends Thread {
  public abstract String getUrl();
  public abstract String getBase64Encode();
  public abstract void onReturn(int responseCode, InputStream is,int lenght);
  protected abstract void onError(Exception e);
}

CameraHttp extends Http and MjpegHttp extends CameraHttp.

http connects to a URL which is the jpeg or mjpeg camera adresses.

I have a Camera Class. It starts a connection with the overridden method mjpegconnection.go();
I also have a static bitmap on ViewCam screen which extends MainScreen.

After it starts:

url = getUrl();
queryString = encodeURL(queryString);
byte postmsg[] = queryString.getBytes("UTF-8");
httpConnection = (HttpConnection) Connector.open(url
    + ";deviceside=false", Connector.READ_WRITE);
httpConnection.setRequestMethod(HttpConnection.GET);
httpConnection.setRequestProperty("Authorization", getBase64Encode());
os = httpConnection.openDataOutputStream(); 

for (int i = 0; i < postmsg.length; i++) {
    os.write(postmsg[i]);
}
{
     if (!cancel) {
         System.out.println(httpConnection.getURL()+ 
             " *****"+httpConnection.getPort());
         System.out.println("onreturn oncesi"
             + httpConnection.getResponseCode());
         onReturn(httpConnection.getResponseCode(), httpConnection
             .openInputStream(),(int) httpConnection.getLength());

         System.out.println("onreturn sornrası");
     }
     os.close();
     httpConnection.close();
}
} catch (Exception e) {
    System.out.println("hata " + e.getMessage());
    try {
        httpConnection.close();
        Thread.sleep(60);
    } catch (Exception ie) {
}
onError(e);
}

After dosomething

 // decides mjpeg-jpeg stream
 // if it is mjpeg, direct to parser,
 // else it sets image with setImage() and return to connection with go();
 public void parse(InputStream is, int lenght) {
     try {
         if (!type.isMjpegStream()) {
             setImage(is, lenght);
             System.gc();
             StaticVar.ActiveCam.setConnected(true);
         } else { 
             if (parser == null) {
             parser = new JpegParser(is, this);
         } else {
             parser.setInputSteam(is, this);
         }
         parser.parse();
         is.close();
     }
     } catch (Exception e) {
     } 
}

and

 public void setImage(InputStream is, int lenght) {
     byte[] raw = new byte[lenght];
     try {
         is.read(raw);
         currentImage = Bitmap.createBitmapFromBytes(raw, 0, raw.length, 1);
         ViewCam.ViewCam=currentImage;       //static var.
     } catch (IOException e) {
         System.out.println("catche***********");
         // TODO Auto-generated catch block
         e.printStackTrace();
     }
 }

How can I repaint the screen to show the bitmap?

And my ViewCam

public class ViewCam extends MainScreen {
Header header;
String headerString;
public static Bitmap ViewCam;// cam image shows
private static Thread My;// runs connection

void OnStart() {
    My = new Thread() {
        public void run() {
            System.out.println("ONSTART");
            StaticVar.ActiveCam.go();
        };
    };
    My.start();
    Bitmap bitmap = Bitmap.getBitmapResource("res/main.png");
    Bitmap bmp2 = ResizeImage.resizeBitmap(bitmap, Display.getWidth(),
            Display.getHeight());
    Background bg = BackgroundFactory.createBitmapBackground(bmp2);
    this.setBackground(bg);
    this.getMainManager().setBackground(bg);


}


public ViewCam() {
    StaticVar.ActiveCam.getIp();

    OnStart();

    headerString ="Cam View";
    header = new Header("res/bartop.png", headerString, 0);
    add(header);

    ViewCam = Bitmap.getBitmapResource("res/spexco_splash.png");
    ViewCam = ResizeImage.bestFit(ViewCam, Display.getWidth(), Display
            .getHeight());
    BitmapField bf = new BitmapField(ViewCam);
    add(bf);
}
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

空心空情空意2024-10-09 19:27:13

尝试 Screen.invalidate()

public void invalidate(int x, int y, int width, int height)

使该屏幕的某个区域无效。
此方法将此屏幕的某个区域标记为需要重新绘制。重绘稍后由主事件调度线程处理。

注意:任何线程都可以安全地调用此方法,并且不需要同步事件锁。

覆盖:
在类管理器中无效
参数:
x - ContentRect 坐标中区域的左边缘。
y - ContentRect 坐标中区域的上边缘。
width - 区域的宽度(以像素为单位)。
height - 区域的高度(以像素为单位)。

Try Screen.invalidate()

public void invalidate(int x, int y, int width, int height)

Invalidates a region of this screen.
This method marks a region of this screen as needing a repaint. The repainting is handled later by the main event dispatch thread.

Note: Any thread can safely invoke this method, and does not require to synchronize on the event lock.

Overrides:
invalidate in class Manager
Parameters:
x - Left edge of the region in ContentRect coordinates.
y - Top edge of the region in ContentRect coordinates.
width - Width (in pixels) of the region.
height - Height (in pixels) of the region.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文