0

所以我正在寻找一种在异步任务完成后只运行一段代码的方法。该代码与Request.executeAsync();facebooksdk for android 中的相关。我将用于解释的代码是:

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如果我response.getGraphObject().getInnerJSONObject().toString()onCompleted()函数中记录存在,我可以清楚地看到我正在寻找的完美结果,即登录用户的 JSONObject,但是,如上面的代码所示,如​​果我将该函数的返回值分配给userProfile变量然后记录它在onCreate()方法中的函数调用之后,然后我的应用程序意外停止并在该Log行抛出 NullPointerException。

我知道发生这种情况是因为me在我记录 JSONObject 时请求尚未完成userProfile,这就是为什么它还没有分配给任何东西,所以我需要知道如何等待函数onCompleted中的方法populateUserProfile()以便userProfile对象可以是成功分配给登录用户的信息?

换句话说,我怎么能等待me请求的异步任务完成,然后登录userProfile到LogCat?

希望我清楚并期待一个解释性的答案。

4

2 回答 2

1

想到的一个解决方案是AsyncTask < T, T, T>在方法中使用然后调用您的函数onPostExecute

编辑:这是一个来自的示例developers,不要看它的作用,只需了解这个概念。在该doInBackground方法中,所有计时工作都已完成,完成后它会调用onPostExecute,因此您可以放心地假设在其中所有 Internet 工作都已完成,您可以继续。

 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 回答