【问题标题】:Thread synchronization issue in blackberry黑莓中的线程同步问题
【发布时间】:2011-04-07 06:11:14
【问题描述】:

在我的应用程序中,我需要建立与 Web 服务器的 Http 连接,当用户选择 ListField 元素时会建立 http 连接。它工作正常,我编写了一个建立 http 连接的方法,它返回一个结果,我的程序处理这些数据。

但它挂起 UI,因为我编写的方法不是在单独的线程中(我编写的建立 http 连接的方法是在单例类中)。现在我在一个单独的线程中更改了我的方法,现在我得到了非法线程状态异常。

所以我更改了我的类(HttpConnection 类-现在它不是单例),现在没有非法状态异常,但我没有得到我想要的结果。

我对java和blackberry的经验比较少,不知道怎么同步两个线程。所以我引入了一个静态变量'i',当程序进入线程时它变为0,当它得到http响应时它变为1。

所以 in 使用 while 循环等待我的程序并检查 i 值。当它变为 1 时,我收到 http 响应(这也是一个静态字符串变量)。但是现在我的程序也无限期挂起,我知道这不是一个好方法。

请通过分享您关于线程同步、链接代码等的想法来帮助解决问题。

这是我的运行方法:

public void run() {
    i =0;
    observerStatusUpdate(i, "Please Wait");
    StreamConnection streamConnection=null;
    InputStream inputStream=null;
    HttpConnection httpConnection = null;
    String result="";
    try {
        streamConnection=(StreamConnection)Connector.open(url);
        httpConnection=(HttpConnection)streamConnection;
        httpConnection.setRequestMethod(HttpConnection.GET);
        //httpConnection.setRequestProperty("Content-Type", "//json");
        int httpStatus=httpConnection.getResponseCode();
        if(httpStatus==HttpConnection.HTTP_OK){
            inputStream = streamConnection.openInputStream();
            //byte[] radioTimeData=new byte[8000];
            byte radioTimedataByte;                 
            while((radioTimedataByte=(byte)inputStream.read())!=-1){
                result=result+(char)radioTimedataByte;
            }

            httpres = result;   
            setResult(result);
            i=1;

            observerStatusUpdate(i, "");
        }
    } catch (IOException e) {   
        i=1;
        UiApplication.getUiApplication().invokeLater(new Runnable() {

            public void run() {
                Dialog.alert("No Internet Connectivity");   
                //System.exit(0);
            }
        });
        System.out.println(e);
    }

它使用另一个类来调用,例如

grabAPIFactory.setUrl(newUrl,o1);           
grabAPIFactory.start();
grabAPIFactory.setPriority(Thread.MAX_PRIORITY);
while(GrabapiFactory.i==0){
    Thread.sleep();
}
string httpresult = GrabapiFactory.httpres;// static variale getting result from server
// process the httpresult here.....

【问题讨论】:

  • 段落和一些说明您的问题的代码可能会有所帮助。
  • 没有看到你代码的相关部分,我们只能猜测是什么问题。
  • 由于我的代码比较长,所以没有添加,谢谢

标签: blackberry java-me


【解决方案1】:

从您的描述看来,您应该重新考虑您的应用架构。我相信那些 sigletons/等待循环是 hacky/丑陋的方式来做你需要的事情。

基本上所有你需要知道的是:在非 UI 线程上你需要在 UI 线程上做 smth,那么 BB 上的一个常见模式是使用以下方法之一:

因此,在用户事件(单击)时,您会启动一个新的 Thread,它会执行网络(或其他一些可能需要长时间运行的操作),并且当您需要更新 UI(例如推送/弹出 Screen,更改出现在Field) 然后你使用Application.invokeLater(Runnable runnable)

还要检查BB User Interface OverviewBlackBerry UI Threading - The Very Basics

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多