0

ユーザー名とIDを取得するまで待ちたいです。また、Facebookで友達のユーザー名とユーザーIDを取得するまで待ちたいです。どうすれば実装できますか?

これらの2つのリクエストの後にコードを記述しましたが、1つのリクエストが終了せず、変数の1つ(たとえば、userName変数)でnullが発生することがあります。

そのため、これら2つのリクエストが完了するまで待ちたいと思います。

それとも、別のより良い実装がありますか?

これは私のコードです:

    final CountDownLatch isForFinish = new CountDownLatch(1);

 private class SessionStatusCallback implements Session.StatusCallback {

        @Override
        public void call(Session session, SessionState state, Exception exception) {
            if( session.isOpened() ){

                Request.executeMyFriendsRequestAsync(session, new Request.GraphUserListCallback() {

                    @Override
                    public void onCompleted(List<GraphUser> users, Response response) {


                        for (int i=0;i<users.size();i++){

                            friendsId+= (users.get(i).getId()+",");
                            friendsName+=(users.get(i).getName()+",");

                        }

                        isForFinish.countDown();

                    }
                });


                Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {

                    @Override
                    public void onCompleted(GraphUser user, Response response) {

                        String userName = user.getName();
                        String userId = user.getId();


                        Intent i = new Intent(getApplicationContext(), TabMainActivity.class);
                        String email=null;
                        try {
                            email = (String) user.getInnerJSONObject().getString("email");
                        } catch (JSONException e1) {
                            // TODO Auto-generated catch block
                            e1.printStackTrace();
                        }
                        if(email!=null){

                            String newemail=new String(email);
                            newemail = email.replace("@", "_");
                            newemail = newemail.replace(".", "_");

                            TelephonyManager mTelephonyMgr;    
                             mTelephonyMgr = (TelephonyManager) getSystemService  
                               (Context.TELEPHONY_SERVICE);     

                             String phoneNumber = mTelephonyMgr.getLine1Number();  

                            String password = "facebook";

                            ParseUser Puser = new ParseUser();
                            Puser.setUsername(userId);
                            Puser.setPassword("facebook");
                            Puser.setEmail(email);
                            Puser.put("Name", userName);

                            try {
                                isForFinish.await();
                            } catch (InterruptedException e1) {
                                // TODO Auto-generated catch block
                                e1.printStackTrace();
                            }
                            Puser.put("friendsId",friendsId );
                            Puser.put("friendsName",friendsName );

                            try {
                                Puser.signUp();
                                ParseObject saleObj =new ParseObject("sale_"+idOfUser);
                                saleObj.saveInBackground();
                                ParseObject deliverObj =new ParseObject("deliver_"+idOfUser);
                                deliverObj.saveInBackground();
                                ParseObject group =new ParseObject("group_"+idOfUser);
                                group.saveInBackground();
                                ParseObject freind =new ParseObject("freind"+idOfUser);
                                freind.saveInBackground();
                            } catch (ParseException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                            }


                            i.putExtra("friendsId", friendsId);
                            i.putExtra("emailOwner", newemail);
                            i.putExtra("phone", phoneNumber);
                            i.putExtra("email",email  );
                            i.putExtra("password",password  );
                            i.putExtra("id",userId  );
                            i.putExtra("name",userName  );

                            startActivity(i);

                        }
                    }
                });
            }
4

2 に答える 2

0

Android Facebook 3.0 を使用して Fragment をセットアップし、このチュートリアルを使用して状態を管理します

https://developers.facebook.com/docs/tutorials/androidsdk/3.0/scrumptious/authenticate/

事前に作成された facebook ログイン ボタンを使用して、xml を使用してログインすることもできます。

<com.facebook.widget.LoginButton
    android:id="@+id/authButton"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="51dp" />

次に、Session StatusCallback を使用して

https://developers.facebook.com/docs/reference/android/3.0/Session.StatusCallback または前のチュートリアルのフラグメントで作成したオーバーライドを使用して、次のように友達を取得するための呼び出しを開始できます

void getFriendsWithApp(final Intent intent){
       final ProgressDialog mDialog = new ProgressDialog(this);
       mDialog.setMessage("Loading...");
       mDialog.setCancelable(false);
       mDialog.show();
       String fqlQuery = "SELECT uid, name, pic_square FROM user WHERE uid IN " +
              "(SELECT uid2 FROM friend WHERE uid1 = me())";
        Bundle params = new Bundle();
        params.putString("q", fqlQuery);
        Session session = Session.getActiveSession();
        Request request = new Request(session,
            "/fql",                         
            params,                         
            HttpMethod.GET,                 
            new Request.Callback(){         
                public void onCompleted(Response response) {
                    try {
                        mDialog.dismiss();
                        Type listType = new TypeToken<ArrayList<Friend>>(){}.getType();
                        Utils.friends = new Gson().fromJson(response.getGraphObject().getInnerJSONObject().getJSONArray("data").toString(), listType);
                        startActivity(intent);
//This is where you would do what you want after you retrieve your json with friends
                    } catch (JSONException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }                  
        }); 
      Request.executeBatchAsync(request);          
}
于 2013-03-18T12:42:56.180 に答える
0

依存スレッドの場合、カウントダウン ラッチを使用できます: http://developer.android.com/reference/java/util/concurrent/CountDownLatch.html

次に例を示します。

http://www.javacodegeeks.com/2011/09/java-concurrency-tutorial.html

于 2013-03-18T09:12:52.517 に答える