そのため、非同期タスクが終了した後に実行するコードのブロックのみを実行する方法を探しています。コードはRequest.executeAsync();
、android の facebooksdk に関連しています。説明に使用するコードは次のとおりです。
public class Home extends Activity {
TextView welcomeTextView;
private JSONObject userProfile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
userProfileFetched = false;
welcomeTextView = (TextView)findViewById(R.id.welcome);
populateUserProfile();
Log.d("USER_PROFILE", userProfile.toString()); //NullPointerException occurs here
}
private void populateUserProfile() {
Request.newMeRequest(Session.getActiveSession(), new Request.GraphUserCallback() {
@Override
public void onCompleted(GraphUser user, Response response) {
userProfile = response.getGraphObject().getInnerJSONObject();
}
}).executeAsync();
}
}
上記のコメントのある行は、アプリが予期せずシャットダウンした行を示しています。アクティビティを最初に開始するonCreate
と、ハウスキーピングのものでメソッドが呼び出されます。次に、要求を非同期的に実行する関数populateUserProfile()
が呼び出されます。関数に存在me
を記録すると、探している完璧な結果、ログインしているユーザーの JSONObject を明確に確認できますが、上記のコードのように、その関数の戻り値を変数に割り当ててからログに記録するとメソッドで関数を呼び出した後、アプリが予期せず停止し、その行で NullPointerException がスローされます。response.getGraphObject().getInnerJSONObject().toString()
onCompleted()
userProfile
onCreate()
Log
me
JSONObjectをログに記録している間にリクエストがまだ完了していないため、これが発生していることはわかっています。そのため、userProfile
まだ何にも割り当てられていないため、関数onCompleted
内のメソッドを待機してオブジェクトをログインしたユーザーの情報に正常に割り当てられましたか?populateUserProfile()
userProfile
つまり、me
リクエストの非同期タスクが完了するのを待ってuserProfile
から、LogCat にログインするにはどうすればよいでしょうか?
私が明確であることを願っており、説明的な答えを楽しみにしています。