blackberry中的线程同步问题

blackberry中的线程同步问题,blackberry,java-me,Blackberry,Java Me,在我的应用程序中,我需要与web服务器建立Http连接,Http连接是在用户选择ListField元素时建立的。它工作正常,我编写了一个方法来建立http连接,它返回一个结果,我的程序处理这些数据 但是它挂起了UI,因为我编写的方法不是在一个单独的线程中,我编写的用于建立http连接的方法是在一个单例类中。现在我在一个单独的线程中更改了我的方法,现在我得到了非法的线程状态异常 所以我改变了我的类HttpConnection类,现在它不是singleton,现在没有非法状态异常,但是我没有得到我想

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

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

所以我改变了我的类HttpConnection类,现在它不是singleton,现在没有非法状态异常,但是我没有得到我想要的结果

我在java和blackberry方面的经验较少,我不知道如何同步两个线程。所以我引入了一个静态变量“I”,当程序进入线程时,它变为0,当它得到http响应时,它变为1

所以在我的程序中使用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.....

根据你的描述,听起来你应该重新考虑你的应用程序架构。我相信那些sigleton/waiting循环是做你需要的事情的骇客/丑陋的方式

基本上,您需要知道的是:在非UI线程上,您需要在UI线程上创建smth,然后BB上的一个常见模式是使用以下方法之一:

因此,当用户事件发生时,单击您启动一个新线程,该线程执行联网或其他一些可能长期运行的操作,当您需要更新UI(例如,推/弹出屏幕)时,更改字段上的外观,然后使用Application.invokeLaterRunnable


另外,请检查和。

段落,以及一些说明您的问题的代码可能会有所帮助。如果没有看到代码的相关部分,我们只能猜测问题所在。由于我的代码很长,因此我没有添加它,谢谢