我正在研究一些代码,这些代码将从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方法在检索数据之前不会结束?
我很感激任何建议。
谢谢。
答案 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。
这是我的第一个答案。如果有什么不对的地方,请告诉我。