在BlackBerry中加载屏幕

时间:2011-07-05 08:18:59

标签: blackberry loading

假设这是我的NeteorkingMainScreen类,它将显示从web恢复的文本。

   public NetworkingMainScreen() {
      setTitle("Networking");
      urlField = new EditField("URL:", "");
      textOutputField = new RichTextField();
      add(urlField);
      add(textOutputField);
   }
   protected void makeMenu(Menu menu, int instance) {
      super.makeMenu(menu, instance);
      menu.add(new MenuItem("Get", 10, 10) {
         public void run() {
            getURL();
         }
      });
   private void getURL() {
       HttpRequestDispatcher dispatcher = new HttpRequestDispatcher(urlField.getText(),"GET", this);
       dispatcher.start();
   } 


 //*********************************************************************************
 //HttpRequestDispatcher class performs the downloading of contents of webpage.
 public class HttpRequestDispatcher extends Thread {
 private String url;
 private String method; // GET or POST
 private NetworkingMainScreen screen;
 public HttpRequestDispatcher(String url, String method, NetworkingMainScreen screen){
     this.url = url;
     this.method = method;
     this.screen = screen;
 }
 public void run() {
 try{
     HttpConnection connection = (HttpConnection)Connector.open(url);
     connection.setRequestMethod(method);
     int responseCode = connection.getResponseCode();   
        if (responseCode != HttpConnection.HTTP_OK){
           screen.requestFailed("Unexpected response code: " + responseCode);
           connection.close();
           return;
        }
        String contentType = connection.getHeaderField("Content-type");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        InputStream responseData = connection.openInputStream();
        byte[] buffer = new byte[10000];
        int bytesRead = responseData.read(buffer);

        while(bytesRead > 0) {
            baos.write(buffer, 0, bytesRead);
            bytesRead = responseData.read(buffer);
        }
        baos.close();
        connection.close();
        screen.requestSucceeded(baos.toByteArray(), contentType);
    }
    catch (IOException ex) {
       screen.requestFailed(ex.toString());
    }
 }
 }


 //***************************************************************************
 //WaitScreen displays animation till the downloading is completed.
 class WaitScreen extends FullScreen
 {
 }

现在我感到困惑......

  1. 何时启动WaitScreen类。假设我首先创建一个WaitScreen对象并推送屏幕对象。

    protected void makeMenu(Menu menu, int instance) {
        super.makeMenu(menu, instance);
        menu.add(new MenuItem("Get", 10, 10) {
            public void run() 
                UiApplication.getUiApplication.pushScreen(new WaitScreen());
                getURL();
            }
         });
    

    我的代码如何知道它应该显示动画屏幕并显示网页的内容,即我的意思是我的代码将如何知道下载数据已经完成。即当我打电话给 popScreen()?  我将使用界面如何使用界面以及使用界面可以获得哪些帮助。 Plz帮助

2 个答案:

答案 0 :(得分:3)

这很简单。

您的HttpRequestDispatcher应该有WaitScreen实例的句柄,以便能够在开始时显示它并在完成后关闭它。

所以在HttpRequestDispatcher内你可以(1)创建WaitScreen。 (2)推它。 (3)做HttpRequestDispatcher应该做的事情。 (4)弹出WaitScreen。像这样的Smth:

final WaitScreen waitScreen = new WaitScreen();

// just to reduce code duplication
final UiApplication app = UiApplication.getUiApplication();

// we are on the non-UI thread, so need 
// to use UiApplication.invokeLater(Runnable action),
// it safely runs the passed action on the UI thread
app.invokeLater(new Runnable() {
    public void run() {
        app.pushScreen(waitScreen);
    }
});

try {
    // main networking actions go here
} catch (..) {
    // error handling goes here
} finally {
    // make sure we close the waitScreen
    app.invokeLater(new Runnable() {
        public void run() {
            app.popScreen(waitScreen);
        }
    });
}

答案 1 :(得分:0)

在这里,试试this。您所要做的就是将代码放入“运行”功能。

如果您需要有关HttpRequest内容的帮助或在那里遇到麻烦,请告诉我。我有一个Web库,其中设置了线程类以使用该帖子中的类。