Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Blackberry BrowserField中的浏览器进度跟踪器_Blackberry_Java Me_Progress Bar_Progressdialog_Browserfield - Fatal编程技术网

Blackberry BrowserField中的浏览器进度跟踪器

Blackberry BrowserField中的浏览器进度跟踪器,blackberry,java-me,progress-bar,progressdialog,browserfield,Blackberry,Java Me,Progress Bar,Progressdialog,Browserfield,有没有人能够在黑莓手机上为BrowserField安装进度跟踪条?我正在努力解决这个问题。我想告诉用户,当他在我的应用程序中打开浏览器字段时,实际发生了一些事情 我已经检查了BrowserFieldProgressBar演示,但这只适用于OS 6,因为它适用于BrowserField2。进度条或带有gif的对话框都可以工作。我尝试实现以下功能,但弹出式屏幕不会显示在浏览器字段上,一旦我退出浏览器字段,它就会卡住: public class BrowserPopUpScreen extends M

有没有人能够在黑莓手机上为BrowserField安装进度跟踪条?我正在努力解决这个问题。我想告诉用户,当他在我的应用程序中打开浏览器字段时,实际发生了一些事情

我已经检查了BrowserFieldProgressBar演示,但这只适用于OS 6,因为它适用于BrowserField2。进度条或带有gif的对话框都可以工作。我尝试实现以下功能,但弹出式屏幕不会显示在浏览器字段上,一旦我退出浏览器字段,它就会卡住:

public class BrowserPopUpScreen extends MainScreen{

    private GridFieldManager _manager;
    private BrowserField _browserField; // Campo de la interfaz que se utiliza para mostrar una página web


    private final String GRAPH_URL = "https://graph.facebook.com"; // URL de Graph API de Facebook.
    private final String NEXT_URL = "http://www.facebook.com/connect/login_success.html"; // URL adonde se redirige al usuario cuando la operacion es exitosa.
    private final String APPLICATION_KEY = "e1812f3b71678c8e0017831cc4cbc87a"; // Llave de la aplicación en Facebook. 
    private final String APPLICATION_SECRET = ""; // Secreto de la aplicacion en Facebook.
    private final String APPLICATION_ID = ""; // ID de la aplicacion en Facebook.

    public static final int FACEBOOK_SIGNUP = 1; // Constante que indica que el usuario desea registrarse con Facebook
    public static final int FACEBOOK_LINK = 2; // Constante que indica que el usuario desea conectar su cuenta de Facebook a la cuenta de Social Voice

    /**
     * Construye la pantalla de browser.
     * 
     * Dependiendo te la acción que recibe en caso de ser FACEBOOK_SIGNUP
     * peticiona en envió de información de usuario a Facebook, en caso contrario
     * solo pide un token de acceso para el usuario.
     * 
     * @param manager
     *          Administrador de contenido que utilizará la pantalla
     * @param action
     *          Acción que se realizará, en caso de ser registro la
     *          acción será FACEBOOK_SIGNUP, en caso de solo conectar 
     *          Fonyk con Facebook será FACEBOOK_LINK
     */
    public BrowserPopUpScreen(GridFieldManager manager, final int action)
    {
        _manager = manager;

        _browserField = new BrowserField();

        // Se crea el URL de la petición y se hace el llamado a dicho URL 
        _browserField.requestContent(new StringBuffer().append("https://graph.facebook.com/oauth/authorize?client_id=").append(APPLICATION_ID).append("&").append("redirect_uri=").append(NEXT_URL).append("&").append("scope=offline_access,publish_stream,email").append("&display=wap").toString());

        final LoadingScreen loadingScreen = new LoadingScreen();
        //Este metodo detecta cuando se realiza un cambio en el BrowserField
        BrowserFieldListener browserListener = new BrowserFieldListener() {

            public void documentLoaded(BrowserField browserField, Document document) throws Exception
            {
                loadingScreen.onClose();
                //Se verifica si es nuestro URL de redirección
                if(_browserField.getDocumentUrl().startsWith(NEXT_URL))
                {

                    String url = _browserField.getDocumentUrl();
                    String code = getElement(url, "code");

                    //Si la petición fue exitosa al URL se le agrega un campo code
                    //revisamos si este no es uno para continuar con la operacion
                    if(!code.equals(""))
                    {

                        //Creamos un cliente http para hacer un GET y obtener el token
                        //de acceso
                        HttpClient httpClient = new HttpClient(MainApp.connFactory);

                        //Se crea un hashtable que va a contener la información de nuestra aplicación
                        //y el código proporcionado previamente
                        Hashtable data = new Hashtable();

                        data.put("client_id", APPLICATION_ID);
                        data.put("redirect_uri", NEXT_URL);
                        data.put("client_secret", APPLICATION_SECRET);
                        data.put("code", code);

                        StringBuffer response = httpClient.doGet(GRAPH_URL.concat("/oauth/access_token"), data);


                        if(response.length() == 0)
                            throw new Exception();

                        //Se obtiene el token de acceso de la respuesta y se asigna a nuestro
                        //objeto usuario
                        String accessToken = getElement(response.toString(), "access_token");

                        MainApp.user.setFacebookAccessToken(accessToken);
                        MainApp.user.setFacebookAccess(true);

                        //Si la acción a realizar es de registro, se utiliza el token de acceso
                        //para peticionar los datos del usuario a FB
                        if(action == FACEBOOK_SIGNUP)
                        {
                            data.clear();
                            data.put("access_token", accessToken);

                            response = null;

                            response = httpClient.doGet(GRAPH_URL.concat("/me"), data);

                            JSONObject jsonResponse = new JSONObject(response.toString());

                            // Al obtener una respuesta se establecen los valores en el objeto definido
                            // inicialmente en la aplicacion
                            MainApp.facebookUserInfo.setFirstName(jsonResponse.optString("first_name"));
                            MainApp.facebookUserInfo.setLastBame(jsonResponse.optString("last_name"));
                            MainApp.facebookUserInfo.setEmail(jsonResponse.optString("email"));
//                          MainApp.facebookUserInfo.set_birthday(jsonResponse.optString("birthday"));
                            MainApp.facebookUserInfo.setGender(jsonResponse.optString("gender"));
                            MainApp.facebookUserInfo.setMiddleName(jsonResponse.optString("middle_name"));
                            MainApp.facebookUserInfo.setLink(jsonResponse.optString("link"));
                        }

                        //Se invoca a la aplicación para cerrar esta pantalla después de 
                        //completarse la operación
                        UiApplication.getUiApplication().invokeLater(new Runnable() {

                            public void run() {
                                UiApplication.getUiApplication().getActiveScreen().close();

                            }
                        });
                    }
                }
             }
        };
        _browserField.addListener(browserListener);
        add(_browserField);
        UiApplication.getUiApplication().pushScreen(loadingScreen);
    }

    private class LoadingScreen extends PopupScreen{
        private AnimatedGIFField _loader;
        public LoadingScreen(){
            super(new VerticalFieldManager());
            GIFEncodedImage ourAnimation = (GIFEncodedImage) GIFEncodedImage.getEncodedImageResource("ajax-loader (7).gif");
            _loader = new AnimatedGIFField(ourAnimation, Field.FIELD_HCENTER);
            this.add(_loader);
        }

        public boolean onClose() {
            setDirty(false);
            return super.onClose();
        }
    }


    /**
     * Extra un valor especificado del URL
     * 
     * @param url 
                URL del cuál se va a extraer un valor
     * @param element
                Elemento que se desea obtener
     * @return
     */
    private String getElement(String url, String element)
    {
        int startIndex = url.indexOf(element);

        if (startIndex > -1) {
            int stopIndex = url.length();

            if (url.indexOf('&', startIndex) > -1) {
                stopIndex = url.indexOf('&', startIndex);
            } else if (url.indexOf(';', startIndex) > -1) {
                stopIndex = url.indexOf(';', startIndex);
            }

            element = url.substring(url.indexOf('=', startIndex) + 1, stopIndex);


            return element;
        }

        return "";
    }   
}

乍一看,我觉得有四件事很奇怪:

1) 。在请求内容后,您将成为设置侦听器(因此,可能会在侦听器能够做出反应之前加载页面)

2) <代码>loadingScreen.onClose()-您认为这会起什么作用

3) <代码>UiApplication.getUiApplication().getActiveScreen().close()-您真的确定要关闭哪个屏幕吗?看来你是个不可救药的乐观主义者

4) 。我从未使用过
BrowserFieldListener
,所以这一点只是猜测:
BrowserFieldListener
还有其他回调,包括针对失败的回调。那么,如果
BrowserField.requestContent(stringurl)
失败(可能有十几个潜在的原因),会不会调用您正在使用的同一个回调

更新

我想问题在于你所做的一切都是在UI线程上顺序发生的。所以你推一个进度屏幕,做一些有用的sthm,然后关闭进度-所有这些都是在一个UI线程上按顺序发生的。在这种情况下,您没有给UI框架实际显示/绘制进度屏幕的机会。要绘制屏幕,UI线程需要一些空闲的cpu时间。当UI线程到达可以开始绘制进度屏幕的点时,它发现已经没有必要这样做了,因为进度屏幕已经关闭

一个简单的(也是肮脏的)解决方法是在按下进度屏幕后立即调用
UiApplication.repaint()
。此方法执行以下操作:

重新绘制整个显示

调用此方法以重新绘制 整个显示器。它无效,并且 然后在屏幕上绘制每个屏幕 显示堆栈


1) 无论您在调用之前还是之后设置BrowserFieldListener,其工作方式都是相同的。在本例中,它与在所述事件之后为按钮事件设置侦听器不同,但我猜它确实看起来很奇怪。2) 我是个白痴错误的方法,应该是close()。3) 是的,我确信是那个屏幕关闭了,经过2个月的彻底测试,我对它没有任何问题,将来我会尝试修改我的屏幕管理,因为我知道我现在的操作方式不是最优的。4) 不,不会的,所以我不会获得错误的成功。但是,是的,我应该检查故障。我的主要问题是加载屏幕没有显示在浏览器字段的顶部,我不知道我做错了什么。恕我直言,你所看到的一切都是错误的,我对黑莓开发相对较新,所以我还不太了解所有的怪癖。@8vius:请参阅更新部分。我会试试看,屏幕确实加载了,只是没有加载到浏览器字段的顶部,谢谢