0

私は BB プログラミングの初心者です。アプリケーション内で Google の URL を開こうとしています。

シミュレータ 9900 で、次のようなエラーが表示されます。

RenderingSession#getBrowserContent() が RenderingException をスローしました

RenderingSession#getBrowserContent() が net.rim.device.api.browser.field.RenderingException をスローしました: 接続中の IOException

MDS-CS を有効にしましたが、それでもこの問題が発生します。

コードは次のとおりです。つまり、BB によって提供されたサンプルです。

public final class BrowserFieldDemo extends UiApplication implements RenderingApplication 
{

    private static final String REFERER = "referer";  

    private RenderingSession _renderingSession;   
    private HttpConnection  _currentConnection;
    private MainScreen _mainScreen;


    /**
     * Entry point for application
     * @param args Command line arguments (not used)
     */
    public static void main(String[] args) 
    {
        BrowserFieldDemo app = new BrowserFieldDemo();

        // Make the currently running thread the application's event
        // dispatch thread and begin processing events.
        app.enterEventDispatcher();
    }

    /**
     * Creates a new BrowserFieldDemo object
     */
    public BrowserFieldDemo() 
    {       
        _mainScreen = new MainScreen(Screen.HORIZONTAL_SCROLL);        
        pushScreen(_mainScreen);
        _renderingSession = RenderingSession.getNewInstance();

        // Enable javascript
        //_renderingSession.getRenderingOptions().setProperty(RenderingOptions.CORE_OPTIONS_GUID, RenderingOptions.JAVASCRIPT_ENABLED, true);                        

        PrimaryResourceFetchThread thread = new PrimaryResourceFetchThread("http://www.google.com", null, null, null, this);
        thread.start();            
    }

    /**
     * Processes an http connection
     * 
     * @param connection The connection to the web content
     * @param e The event triggering the connection
     */
    void processConnection(HttpConnection connection, Event e) 
    {
        // Cancel previous request
        if (_currentConnection != null) 
        {
            try 
            {
                _currentConnection.close();
            } 
            catch (IOException e1) 
            {                
            }
        }

        _currentConnection = connection;

        BrowserContent browserContent = null;

        try 
        {
            browserContent = _renderingSession.getBrowserContent(connection, this, e);

            if (browserContent != null) 
            {
                Field field = browserContent.getDisplayableContent();

                if (field != null) 
                {
                    synchronized (Application.getEventLock()) 
                    {
                        _mainScreen.deleteAll();
                        _mainScreen.add(field);
                    }
                }

                browserContent.finishLoading();
            }

        } 
        catch (RenderingException re) 
        {
            Utilities.errorDialog("RenderingSession#getBrowserContent() threw " + re.toString());
        } 
        finally 
        {
            SecondaryResourceFetchThread.doneAddingImages();
        }

    }    

    /**
     * @see net.rim.device.api.browser.field.RenderingApplication#eventOccurred(Event)
     */
    public Object eventOccurred(Event event) 
    {
        int eventId = event.getUID();

        switch (eventId) 
        {
            case Event.EVENT_URL_REQUESTED : 
            {
                UrlRequestedEvent urlRequestedEvent = (UrlRequestedEvent) event;    

                PrimaryResourceFetchThread thread = new PrimaryResourceFetchThread(urlRequestedEvent.getURL(),
                                                                                         urlRequestedEvent.getHeaders(), 
                                                                                         urlRequestedEvent.getPostData(),
                                                                                         event, this);
                thread.start();

                break;

            } 
            case Event.EVENT_BROWSER_CONTENT_CHANGED: 
            {                
                // Browser field title might have changed update title.
                BrowserContentChangedEvent browserContentChangedEvent = (BrowserContentChangedEvent) event; 

                if (browserContentChangedEvent.getSource() instanceof BrowserContent) 
                { 
                    BrowserContent browserField = (BrowserContent) browserContentChangedEvent.getSource(); 
                    String newTitle = browserField.getTitle();
                    if (newTitle != null) 
                    {
                        synchronized (getAppEventLock()) 
                        { 
                            _mainScreen.setTitle(newTitle);
                        }                                               
                    }                                       
                }                   

                break;                

            } 
            case Event.EVENT_REDIRECT : 
            {
                RedirectEvent e = (RedirectEvent) event;
                String referrer = e.getSourceURL();

                switch (e.getType()) 
                {  
                    case RedirectEvent.TYPE_SINGLE_FRAME_REDIRECT :
                        // Show redirect message.
                        Application.getApplication().invokeAndWait(new Runnable() 
                        {
                            public void run() 
                            {
                                Status.show("You are being redirected to a different page...");
                            }
                        });

                    break;

                    case RedirectEvent.TYPE_JAVASCRIPT :
                        break;

                    case RedirectEvent.TYPE_META :
                        // MSIE and Mozilla don't send a Referer for META Refresh.
                        referrer = null;     
                        break;

                    case RedirectEvent.TYPE_300_REDIRECT :
                        // MSIE, Mozilla, and Opera all send the original
                        // request's Referer as the Referer for the new
                        // request.
                        Object eventSource = e.getSource();
                        if (eventSource instanceof HttpConnection) 
                        {
                            referrer = ((HttpConnection)eventSource).getRequestProperty(REFERER);
                        }

                        break;
                    }

                    HttpHeaders requestHeaders = new HttpHeaders();
                    requestHeaders.setProperty(REFERER, referrer);
                    PrimaryResourceFetchThread thread = new PrimaryResourceFetchThread(e.getLocation(), requestHeaders,null, event, this);
                    thread.start();
                    break;

            } 
            case Event.EVENT_CLOSE :
                // TODO: close the appication
                break;

            case Event.EVENT_SET_HEADER :        // No cache support.
            case Event.EVENT_SET_HTTP_COOKIE :   // No cookie support.
            case Event.EVENT_HISTORY :           // No history support.
            case Event.EVENT_EXECUTING_SCRIPT :  // No progress bar is supported.
            case Event.EVENT_FULL_WINDOW :       // No full window support.
            case Event.EVENT_STOP :              // No stop loading support.
            default :
        }

        return null;
    }

    /**
     * @see net.rim.device.api.browser.field.RenderingApplication#getAvailableHeight(BrowserContent)
     */
    public int getAvailableHeight(BrowserContent browserField) 
    {
        // Field has full screen.
        return Display.getHeight();
    }

    /**
     * @see net.rim.device.api.browser.field.RenderingApplication#getAvailableWidth(BrowserContent)
     */
    public int getAvailableWidth(BrowserContent browserField) 
    {
        // Field has full screen.
        return Display.getWidth();
    }

    /**
     * @see net.rim.device.api.browser.field.RenderingApplication#getHistoryPosition(BrowserContent)
     */
    public int getHistoryPosition(BrowserContent browserField) 
    {
        // No history support.
        return 0;
    }


    /**
     * @see net.rim.device.api.browser.field.RenderingApplication#getHTTPCookie(String)
     */
    public String getHTTPCookie(String url) 
    {
        // No cookie support.
        return null;
    }

    /**
     * @see net.rim.device.api.browser.field.RenderingApplication#getResource(RequestedResource, BrowserContent)
     */
    public HttpConnection getResource( RequestedResource resource, BrowserContent referrer) 
    {
        if (resource == null) 
        {
            return null;
        }

        // Check if this is cache-only request.
        if (resource.isCacheOnly()) 
        {
            // No cache support.
            return null;
        }

        String url = resource.getUrl();

        if (url == null) 
        {
            return null;
        }

        // If referrer is null we must return the connection.
        if (referrer == null) 
        {
            HttpConnection connection = Utilities.makeConnection(resource.getUrl(), resource.getRequestHeaders(), null);

            return connection;

        } 
        else 
        {
            // If referrer is provided we can set up the connection on a separate thread.
            SecondaryResourceFetchThread.enqueue(resource, referrer);
        }

        return null;
    }

    /**
     * @see net.rim.device.api.browser.field.RenderingApplication#invokeRunnable(Runnable)
     */
    public void invokeRunnable(Runnable runnable) 
    {       
        (new Thread(runnable)).start();
    }
}

/**
 * A Thread class to fetch content using an http connection
 */
final class PrimaryResourceFetchThread extends Thread 
{    
    private BrowserFieldDemo _application;
    private Event _event;
    private byte[] _postData;
    private HttpHeaders _requestHeaders;
    private String _url;

    /**
     * Constructor to create a PrimaryResourceFetchThread which fetches the web
     * resource from the specified url.
     * 
     * @param url The url to fetch the content from
     * @param requestHeaders The http request headers used to fetch the content
     * @param postData Data which is to be posted to the url
     * @param event The event triggering the connection
     * @param application The application requesting the connection
     */
    PrimaryResourceFetchThread(String url, HttpHeaders requestHeaders, byte[] postData, Event event, BrowserFieldDemo application) 
    {
        _url = url;
        _requestHeaders = requestHeaders;
        _postData = postData;
        _application = application;
        _event = event;
    }

    /**
     * Connects to the url associated with this object
     * 
     * @see java.lang.Thread#run()
     */
    public void run() 
    {
        HttpConnection connection = Utilities.makeConnection(_url, _requestHeaders, _postData);
        _application.processConnection(connection, _event);        
    }
}
4

1 に答える 1

3

これが私が試すことです:

  1. まず、読み込もうとしている URL ( のように見えます) を取得し、http://www.google.comアプリを終了して、シミュレーターの通常のブラウザー アプリを使用して同じ URL にアクセスします。それは機能しますか?ブラウザーで機能しない場合はアプリでも機能しないため、シミュレーターがネットワークに接続できない理由をデバッグする必要があります。

  2. シミュレーターをブロックしているソフトウェア ファイアウォール(Windows ファイアウォールなど) はありますか? ファイアウォールを実行している場合は、fledge.exeプロセスがネットワーク接続を許可されていることを確認する必要があります。許可されていない場合、これは機能しません。また、プロセスの例外を許可する必要がある場合もありjava.exeます。BB 7.1 プラグインの場合、フレッジ プロセスは次のとおりです。

    C:\eclipse\indigo\plugins\net.rim.ejde.componentpack7.1.0_7.1.0.10\components\simulator\fledge.exe

    もちろん、Eclipse をインストールした場所によって、そのパスのルートは異なります。

  3. Java コードでURL を変更してみてください。すべての URL で同じ問題が発生しますか?

  4. http://www.google.comなんらかの理由でブロックされています。あなたはどこにいますか? 世界中のインターネット サービス プロバイダーがどのように機能しているかわかりません。少なくとも、http://www.google.co.in、または同様のものを使用する必要があるかもしれません。

  5. ターゲットにしようとしている BB OS のバージョンがわかりません。現在、ほとんどの人 (まだ BlackBerry Java をサポートしている場合) は、OS 5.0 より低いものはサポートしていません。サポートを OS 5.0 以降に制限できる場合は、そのデモのコードを使用しないことをお勧めします。5.0 には、 BrowserField2 とも呼ばれるBrowserFieldクラスがあります。このクラスははるかに使いやすいです。プラグインの同じ BlackBerry サンプル フォルダーに別のデモがあります。と呼ばれていbrowserfield2demoます。そのデモを実行してみて、同じ問題があるかどうかを確認してください。

  6. 元の (5.0 より前の) BrowserFieldDemo を使い続けたい場合は、コードを変更して、より多くのデバッグ情報を取得できます。例外はここから来ています:

    catch (RenderingException re) 
    {
        Utilities.errorDialog("RenderingSession#getBrowserContent() threw " + re.toString());
    } 
    

    コードを次のように変更してみてください

    catch (RenderingException re) 
    {
        Utilities.errorDialog("RenderingSession#getBrowserContent() threw " + re.toString());
        System.out.println(re.printStackTrace());
    } 
    

    Eclipse コンソール ウィンドウでスタック トレースを確認します。これにより、もう少し情報が得られるはずです。

  7. ネットワーク接続をオフにしてシミュレーターを実行している可能性がありますか? 一部の人々 (私自身を含む) は、プロセスを高速化することを期待して、ネットワーク接続をオフにしてシミュレーターを起動する習慣があります。もちろん、テストしているアプリがネットワークを使用している場合は、アプリを起動する前にオプションでネットワークを有効にする必要があります。上記の手順 (1) は、ネットワーク接続 (GSM や Wi-Fi など) がオフになっていると失敗しますが、なぜ失敗したのか気付いていないかもしれません。

  8. Eclipse の実行/デバッグ構成は、シミュレーターの起動時にアプリを自動的に実行するように設定されていますか? もしそうなら、私はそれをしないことをお勧めし、ユーザーと同じようにアプリのアイコンをクリックしてアプリを手動で実行するように構成します. これがこのように設定されているかどうかは、[ Debug Configurations]ウィンドウの[ Simulator] -> [ General ] ペインで確認できます。[起動時にアプリまたは URL を起動する] ボックスをオフにします。

ここに画像の説明を入力

それらは私の提案です。一般的なネットワーク障害のように見えます。私の推測では、ファイアウォールの問題です (おそらく、インストールする JDE プラグインのバージョンごとに、シミュレーターにファイアウォールの例外を追加する必要があることに注意してください ... 5.0、6.0、7.0、7.1)。

ただし、これらの手順を試して、より多くの情報を投稿してください。幸運を!

于 2013-02-03T10:30:35.677 に答える