OnCreate在异步检索数据之前结束

时间:2017-08-03 21:06:37

标签: android facebook android-asynctask oncreate

我正在研究一些代码,这些代码将从Facebook提取JSON信息并将其置于EditText视图中。我遇到的问题是,由于我调用检索数据的函数是异步函数,因此我的onCreate函数在我的活动结束后正在检索数据,因此当时文本无法更新一片空白。 如何确保我的OnCreate方法在检索数据之前不会结束?

这是我的活动类:

public class PersonalInfoMain extends AppCompatActivity implements GraphService.OnDownloadComplete {

    public EditText mName;
    public String name;

    String mValue, mField;

    private static final String TAG = "PersonalInfoMain";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.d(TAG, "onCreate: starts");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_personal_info_main);

        mName = (EditText) findViewById(R.id.editText_name);

        //Calling GraphService class
        GraphService mGraphService = new GraphService(this);
        mField = "name";
        mGraphService.execute(mField);
        mName.setText(name);
    }
}

    //My Callback function located in the same activity:
    @Override
    public void onDownloadComplete(String s) {
            name = s;
    }

这是我的课程,我将GraphService标记为从Facebook提取信息:

public class GraphService extends AsyncTask<String, Void, String>{

private static final String TAG = "GraphService";

private String mField;
private String mValue;

private final OnDownloadComplete mCallback;

public interface OnDownloadComplete{
    void onDownloadComplete(String data);
}

public GraphService(OnDownloadComplete callback){
    mCallback = callback;
}

@Override
public String doInBackground(final String... params) {
    Log.d(TAG, "doInBackground: starts");

    mField = params[0];

    //Beginning of Facebook implementation
    GraphRequest request = GraphRequest.newMeRequest(
        AccessToken.getCurrentAccessToken(),
        new GraphRequest.GraphJSONObjectCallback() {

            @Override
            public void onCompleted(JSONObject object, GraphResponse response) {
                try {
                        mValue = object.getString(mField);

                } catch (JSONException e) {
                    e.printStackTrace();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    );

    Bundle parameters = new Bundle();
    parameters.putString("fields", mField);
    request.setParameters(parameters);
    request.executeAsync();
    return mValue;

}

@Override
protected void onPostExecute(String s) {
    if(mCallback != null){
        mCallback.onDownloadComplete(s);
    }
}

我的Android监视器显示此工作流程:

D/MainActivity: onCreate: starts
D/MainActivity: isLoggedIn: starts
D/MainActivity: isLoggedIn: ends
D/MainActivity: onCreate: ends
D/PersonalInfoMain: onCreate: starts
D/PersonalInfoMain: onCreate: name = null
D/GraphService: doInBackground: starts
D/PersonalInfoMain: onCreate: ends
D/PersonalInfoMain: onResume: starts
D/PersonalInfoMain: onResume: name = null
D/GraphService: doInBackground: ends
D/PersonalInfoMain: onResume: ends
D/GraphService: onPostExecute: starts
D/PersonalInfoMain: onDownloadComplete: starts
D/PersonalInfoMain: onDownloadComplete: ends
D/GraphService: onPostExecute: ends
D/GraphService: onCompleted: starts, JSON object = {"name":"Tom"}, response = {"name":"Tom"}
D/GraphService: onCompleted: json object:{"name":"Tom"}
D/GraphService: onCompleted: ends

正如您所看到的,我的活动中的.setText()方法将其设置为空值,因为Async任务(onCompleted()方法)尚未返回数据。 如何确保我的OnCreate方法在检索数据之前不会结束?

我很感激任何建议。

谢谢。

2 个答案:

答案 0 :(得分:0)

你不能和你不应该,因为你正在做异步网络请求。更好的是,只要您需要来自网络呼叫的数据,就可以调用setText方法。

//我的回调函数位于同一个活动中:

@Override
public void onDownloadComplete(String s) {
        mName.setText(s);
}

答案 1 :(得分:0)

也许您可以尝试将代码从onDownloadComplete()移动到onPostExecute()。就个人而言,我认为没必要使用

公共界面OnDownloadComplete {

void onDownloadComplete(String data);

}

这里。

在执行方法doInBackground()之后,它的结果(mValue)将作为s传递给onPostExecute(String s)。

在onPostExecute()中,您可以更新UI。

这是我的第一个答案。如果有什么不对的地方,请告诉我。