0

そのため、非同期タスクが終了した後に実行するコードのブロックのみを実行する方法を探しています。コードは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()userProfileonCreate()Log

meJSONObjectをログに記録している間にリクエストがまだ完了していないため、これが発生していることはわかっています。そのため、userProfileまだ何にも割り当てられていないため、関数onCompleted内のメソッドを待機してオブジェクトをログインしたユーザーの情報に正常に割り当てられましたか?populateUserProfile()userProfile

つまり、meリクエストの非同期タスクが完了するのを待ってuserProfileから、LogCat にログインするにはどうすればよいでしょうか?

私が明確であることを願っており、説明的な答えを楽しみにしています。

4

2 に答える 2

1

頭に浮かぶ解決策は、メソッドAsyncTask < T, T, T>で関数を使用してから呼び出すことです。onPostExecute

編集:これは の例developersです。それが何をするのか見てはいけません。概念を理解してください。このdoInBackgroundメソッドでは、時間のかかるすべての作業が完了し、完了すると が呼び出されますonPostExecute。したがって、その内部ですべてのインターネット作業が完了し、続行できると安全に想定できます。

 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
 protected Long doInBackground(URL... urls) {
     int count = urls.length;
     long totalSize = 0;
     for (int i = 0; i < count; i++) {
         totalSize += Downloader.downloadFile(urls[i]);
         publishProgress((int) ((i / (float) count) * 100));
         // Escape early if cancel() is called
         if (isCancelled()) break;
     }
     return totalSize;
 }

 protected void onProgressUpdate(Integer... progress) {
     setProgressPercent(progress[0]);
 }

 protected void onPostExecute(Long result) {
     showDialog("Downloaded " + result + " bytes");
     // here you call the function, the task is ended.

 }}
于 2014-06-08T18:57:07.277 に答える
0
populateUserProfile(){

new AsyncTask<Void, Void, JSONObject>() {

        @Override
        protected JSONObject doInBackground(Void params) {
           return response.getGraphObject().getInnerJSONObject();
        }

        @Override
        protected void onPostExecute(JSONObject result) {
           Log.d("USER_PROFILE", result.toString());
        }

    }.execute();
}
于 2014-06-08T19:13:17.893 に答える