开发者

Loading Screen in BlackBerry

开发者 https://www.devze.com 2023-03-17 13:43 出处:网络
Suppose this is my NeteorkingMainScreen class which will display the text retrived from web. public NetworkingMainScreen() {

Suppose this is my NeteorkingMainScreen class which will display the text retrived from 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, byte开发者_运维技巧sRead);
            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
 {
 }

Now I m getting confused...

  1. When to start the WaitScreen class. Suppose i start by creating an object of WaitScreen and pushing the screen object.

    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();
            }
         });
    

    How would my code know that it should displaying the animated Screen and display the contents of the webpages ie i mean how my code will knows downloading data has been completed. ie when i will call popScreen()? I interface is to be used how can use the interface and what help we will get by using the interface.? Plz help


This is rather simple.

Your HttpRequestDispatcher should have a handle to the WaitScreen instance to be able to show it on start and close it upon completion.

So inside of the HttpRequestDispatcher you could (1) create the WaitScreen. (2) Push it. (3) Do the stuff the HttpRequestDispatcher should do. (4) Pop the the WaitScreen. Smth like that:

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);
        }
    });
}


Here, Try this. All you have to do is put your code into the "run" function.

If you want help with the HttpRequest stuff or have trouble with the classes there, let me know. I have a web library with thread classes set up to use the classes within that post.

0

精彩评论

暂无评论...
验证码 换一张
取 消