【问题标题】:onPostExecute not being called by ASyncTask execute()ASyncTask execute() 未调用 onPostExecute
【发布时间】:2013-04-07 15:37:33
【问题描述】:

我无法解释为什么我的代码中没有调用 onPostExecute。我之前已经成功地将几乎这个确切的代码用于不同的应用程序。它在return result; 之前打印'onPreExecute' 和从doInBackground 获取JSON 的成功结果,但随后onPostExecute 不打印任何内容——无论是否使用超级调用——而且不会将我的字符串返回给UI 线程。有什么想法吗?

public class PrivateLoadFromServer extends AsyncTask<String, Integer, String> {

    InputStream is = null;
    String result = null;
    String error_text="";
    JSONObject j = null;
    String url;
    SQLiteOpenHelper helper;
    CustomActivity activity;
    private Context context;
    private ProgressDialog dialog;
    private int count;
    String employee;
    String text;

    public PrivateLoadFromServer(CustomActivity activity,String employee,String url){
        this.url=url;
        this.employee=employee;
        this.activity=activity;
    }

    @Override
    protected void onPreExecute() {
        system.out.println("onPreExecute");

    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);
        System.out.println("onPostExecute");

        activity.setJSONResult(result);
        /*
        if(result!=null){
            System.out.println("Task reported successful");
            taskHandler.taskSuccessful(this.result);
            activity.setJSONResult(this.result);
        } else {
            taskHandler.taskFailed();
        }
        */
        //return;
    }

    @Override
    protected String doInBackground(String... params) {
        System.out.println("Running aSyncTask");

            // Successful code to get JSON result string from server omitted.

        System.out.println("Raw at doInBackground: " + result);
    return result;

编辑:最初应该发布此内容,我将其称为 CustomActivity 中的内部类,如下所示:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_login);
    helper=new DBHelper(this);
    loadBasicData();

}

 private void loadBasicData() {

    // If you can encode all of these into one JSON Object, cool.

    String url="*****" //Omitted URL.
    String employee=null;

    PrivateLoadFromServer syncTask = new PrivateLoadFromServer(this,employee,url);

    syncTask.execute();

    try {
        syncTask.get(15000, TimeUnit.MILLISECONDS);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (TimeoutException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    System.out.println("JSONResult at Activity:"+jsonResult); // jsonResult is null

    }
}

    public void setJSONResult(String result){
    System.out.println("setJSONResult"+result);
    this.jsonResult=result; // jsonResult is a field in the Activity.
}

【问题讨论】:

  • 使用AsyncTask 类来执行异步操作并仍然阻塞调用.get() 方法的主线程是没有意义的。此外,您遇到的问题总是会出现,或者只是在加载时旋转屏幕?
  • 总是出现,与轮换无关。而且我必须阻塞主线程,以便在调用将其加载到本地数据库的方法之前获得 JSON 结果,否则它会因空指针而失败。
  • 网络请求完成后你不能在AsyncTask中执行你的数据库加载吗?我不确定这是不是问题(可能是),但可以肯定的是,您当前的方法会导致其他问题(例如 ANR)。
  • 哦,我试一试。您的意思是在 doInBackground 中使用数据库加载方法,而不是通过 onPostExecute 传递给 UI 线程?
  • 我认为问题是由你睡眠主线程的方式引起的。您需要将输出语句 System.out.println("JSONResult at Activity:"+jsonResult); 放在 onPostExecute() 中,并且在 Async 运行时不要让主线程休眠。附带说明一下,您应该使用 androids Log 类而不是 System.out

标签: android android-asynctask


【解决方案1】:

检查您是否在代码中某处显式取消 AsyncTask,然后才能发布执行。

【讨论】:

【解决方案2】:

因为你调用的是get,所以这个方法也返回了JSON结果(见AsyncTask.java的源码。所以你可以直接在输出上调用你的方法。

try {
    setJSONResult(syncTask.get(15000, TimeUnit.MILLISECONDS));
} catch (InterruptedException e) {
    e.printStackTrace();
} catch (ExecutionException e) {
    e.printStackTrace();
} catch (TimeoutException e) {
    e.printStackTrace();
}

【讨论】:

  • 我仍然没有调用 onPostExecute 但这确实让我将结果直接带入 UI 线程,这样就可以了,非常感谢 :) 我最终可能会将数据库操作带入 ASync线程作为主要帖子评论者最后建议以删除`.get()\。
【解决方案3】:

onPostExecute() 在主 UI 线程上调用。如果它没有被调用,则意味着您的 UI 线程被阻止执行其他操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多