【问题标题】:Android AsyncTask PostExecute [closed]Android AsyncTask PostExecute [关闭]
【发布时间】:2012-12-13 15:38:53
【问题描述】:

我在函数中使用 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();
                }   
            }});

【问题讨论】:

  • 我们不知道你在问什么,你应该详细说明。你想做什么?你试过什么?
  • 发布你所有的 AsyncTask 函数以获得更好的描述,你也可以在 AsyncTask 的 onPostExecute 方法中赋值。
  • 这是在新线程中执行任务的过时 Android 方法...请参阅下面使用 AsyncTask 的我的帖子,并将 try{} 块中的所有内容移动到我的代码中的 doInBackground 函数内下面...

标签: android


【解决方案1】:

如果您想在 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;
}

【讨论】:

  • 这里有一个相关的问题,onPostExecute运行时是否需要注意调用活动为空(由于用户交互或其他原因被Android销毁)?我计划添加这样的代码来禁用 UI EditText,直到通过 AsyncTask 设置应用程序的数据库。在 onPostExecute 中,我打算调用一个回调来启用 EditText。此 EditText 仅应在配置 DB 后才可交互。我需要担心调用活动为空吗?
【解决方案2】:

您不会从 AsyncTasks 返回值。您需要将要更改的任何内容传递给 AsyncTask 并在 onPostExecute() 中更改值。请发布更多代码并更好地解释您的方案以获得完整答案。

编辑:正如 Jamis0n 所述,AsyncTask 计算的值也可以使用 get() 方法“获取”。

【讨论】:

  • 这不完全正确... doInBackground 的返回值可以通过new myTask().execute(params).get(); 获得,虽然它不推荐,因为它绑定了主 UI。我上面的解决方案在调用活动中使用了一个回调函数,这听起来像是 OP 想要的
  • 虽然我有点后悔指出这一点,因为我自己永远不会使用它!
猜你喜欢
  • 2021-04-04
  • 2015-05-12
  • 2012-11-19
  • 1970-01-01
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多