我在函数中使用AsyncTask 如何在异步完成执行时返回一个值,因为我不能在这里使用PostExecute方法
AsyncTask.execute(new Runnable() {
public void run() {}}
继承守则。 我需要从SpinnerList检索值以在主线程上使用em。 但是,每当我要求数据时,通常我会得到空值,因为它还没有返回值。
AsyncTask.execute(new Runnable() {
public void run() {
try{
String fql = "SELECT uid, name FROM user WHERE is_app_user AND uid IN (SELECT uid2 FROM friend WHERE uid1 = me())";
Bundle parameters = new Bundle();
parameters.putString("query", fql);
parameters.putString("method", "fql.query");
parameters.putString("access_token", fb.getAccessToken());
String Response = fb.request(parameters);
JSONArray json = new JSONArray(Response);
list = new ArrayList<String[][]>();
String[][] friendsToList = new String[1][2];
SpinnerList = new ArrayList<String>();
String TempToSpinnerList=new String();
for(int i = 0; i < json.length(); ++i){
friendsToList[0][0] = json.getJSONObject(i).getString("uid");
friendsToList[0][1] = json.getJSONObject(i).getString("name");
TempToSpinnerList= friendsToList[0][1];
list.add(friendsToList);
SpinnerList.add(TempToSpinnerList);
Log.e("Test"," "+friendsToList[0][1]+" "+friendsToList[0][0]);
}
//dataAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
//spinner.setAdapter(dataAdapter);
/* jsonUser = fb.request(parameters);
friendObj = Util.parseJson(jsonUser);
friendArray = friendObj.getJSONArray("data");
//
friendlist = new ArrayList<String[][]>();
String[][] friendsToList = new String[1][2];
int friendCount = 0;
String fId, fNm;
JSONObject friend;
for (int i = 0;i<friendArray.length();i++){
//Get a JSONObject from the JSONArray
friend = friendArray.getJSONObject(i);
//Extract the strings from the JSONObject
friendsToList[0][0] = friend.getString("id");
friendsToList[0][1] = friend.getString("name");
friendlist.add(friendsToList);
//Set the values to our arrays
Log.e("Tester",""+ friendsToList[0][0]+" "+ friendsToList[0][1]);
friendCount ++;}*/
}
catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FacebookError e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}});
答案 0 :(得分:6)
如果要在Asynctask完成后执行某些功能,可以在调用活动中设置回调函数。在AsyncTask类中创建一个构造函数,并将其传递给调用活动。然后使用此引用在任务完成时调用回调函数。
您还可以在onPostExecute中更新UI,如果它适合您,则更简单。
public class MyTask extends AsyncTask<String, Void, String>
{
private MainActivity activity;
public MyTask(MainActivity activity) {
this.activity = activity;
}
@Override
protected Void doInBackground(String... params) {
//Do background stuff
}
protected void onPostExecute() {
//dismiss progress dialog if needed
//Callback function in MainActivity to indicate task is done
activity.taskDone("some string");
}
}
MainActivity.java
//Pass your params array and the current activity to the AsyncTask
new MyTask(MainActivity.this).execute(params);
//Callback for AsyncTask to call when its completed
public void taskDone(String returnVal) {
//Do stuff once data has been loaded
returnText = returnVal;
}
答案 1 :(得分:1)
您不会从AsyncTasks返回值。您需要将要更改的内容传递给AsyncTask,并且在onPostExecute()中可以更改该值。请发布更多代码并更好地解释您的方案,以获得完整的答案。
编辑:正如Jamis0n所述,AsyncTask计算的值也可以使用get()方法“得到”。