黑莓中的线程同步问题

时间:2011-04-07 06:11:15

标签: blackberry java-me

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

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

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

我在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.....

1 个答案:

答案 0 :(得分:2)

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

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

因此,在用户事件(单击)时,您启动一​​个新的Thread,它会执行网络(或其他一些可能长时间运行的操作)以及何时需要更新UI(例如,推送/弹出{{1 },改变Screen上的外观,然后使用Field

同时检查BB User Interface OverviewBlackBerry UI Threading - The Very Basics