2

我的 android 应用程序中有 2 个活动。在第一个上,我要求用户使用 facebook 登录。用户登录后,我收集用户数据,例如电子邮件、姓名并调用一个新活动,将这些参数传递给它。以下是我的 facebook 授权方法:

 public void loginFB(final View v)
    {           
        facebook.authorize(this, new String[] { "email", "read_stream" }, new DialogListener() {

            @Override
            public void onComplete(Bundle values) {
                this.getlogininfo(v);
            }
            private void getlogininfo(View v) {
                // TODO Auto-generated method stub
                logininfo(v);                   
            }

            @Override
            public void onFacebookError(FacebookError error) {}

            @Override
            public void onError(DialogError e) {}

            @Override
            public void onCancel() {}
     });            
    }

下面是我的logininfo() 方法:

public void logininfo(final View v){
    mAsyncRunner.request("me", new RequestListener(){    
        @Override
        public void onComplete(String response, Object state) {
            try{
                Log.d("Profile", response.toString());
                JSONObject json = Util.parseJson(response);
                final String fname1 = json.getString("first_name");
                final String lname1 = json.getString("last_name");
                final String email = json.getString("email");

                Intent fbLogged = new Intent();
                Bundle passData = new Bundle();
                passData.putString("fname", fname1);
                passData.putString("lname", lname1);
                passData.putString("email", email);
                fbLogged.putExtras(passData);
                fbLogged.setClass(v.getContext(), RequestFb.class);
                startActivity(fbLogged);    
            }
            catch(JSONException e){
                Log.w("This", "eror");
            }               
        }    
        @Override
        public void onIOException(IOException e, Object state) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onFileNotFoundException(FileNotFoundException e,
                Object state) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onMalformedURLException(MalformedURLException e,
                Object state) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onFacebookError(FacebookError e, Object state) {
            // TODO Auto-generated method stub

        }           
    });
  }     

所以,我的新活动是从OnComplete()获取用户数据开始。

这很好用,但是当用户单击登录并使用 facebook 登录时,第一个活动页面会在屏幕上保留几秒钟,然后调用下一个活动。有一个滞后。我该如何解决滞后问题?当用户点击登录并授权登录后,应直接将用户带到第二个活动。有什么建议么?

谢谢!

4

1 回答 1

2

这很简单,您正在一个新线程中运行 fb 图请求(使用AsyncRunner),但只有当该请求完成时,您才开始新的活动,这就是您得到“滞后”的原因。

您应该在新活动而不是第一个活动中运行图形请求,例如:

public void loginFB(final View v) {
    facebook.authorize(this, new String[] { "email", "read_stream" }, new DialogListener() {
        @Override
        public void onComplete(Bundle values) {
            Intent fbLogged = new Intent(v.getContext(), RequestFb.class);
            startActivity(fbLogged);
        }

        @Override
        public void onFacebookError(FacebookError error) {}

        @Override
        public void onError(DialogError e) {}

        @Override
        public void onCancel() {}
    });
}

public class RequestFb extend Activity {
    protected void onCreate(Bundle savedInstanceState) {
        Facebook facebook = new Facebook("YOUR_APP_ID");
        AsyncFacebookRunner asyncRunner = new AsyncFacebookRunner(facebook);

        asyncRunner.request("me", new RequestListener(){
            try {
                final JSONObject json = Util.parseJson(response);
                final String fname1 = json.getString("first_name");
                final String lname1 = json.getString("last_name");
                final String email = json.getString("email");

                runOnUiThread(new Runnable() {
                    public void run() {
                        // use the data
                    }
                });
            }
            catch(JSONException e) {
                Log.w("This", "eror");
            }
        });

    }
}
于 2012-06-04T21:56:25.560 回答