【问题标题】:Change UI crashes when called from onPostExecute从 onPostExecute 调用时更改 UI 崩溃
【发布时间】:2014-07-24 07:31:02
【问题描述】:

我无法在 DialogFragment 中修改 UI onPostExecute

我已经阅读了有关此的所有问题。这不是同样的情况。相信我。

我知道一个AsyncTask doInBackground 函数有他自己的线程,你必须在onPreExecute 和onPostExecute 中触摸视图。 有了这些东西,应用程序仍然崩溃。

我得到的例外是:

E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.NullPointerException
            at .onPostExecute(CustomDialogFragment.java:310)     
            at android.os.AsyncTask.finish(AsyncTask.java:631)                

Can't touch views from onPostExecute's AsyncTask

【问题讨论】:

  • 这里:activity.runOnUiThread(new Runnable() { ... }。我认为activity 为空,你为什么不使用getActivity(),如下所示?无论如何嵌套AsyncTask 可能很危险,您可能会造成内存泄漏。
  • 你不需要runOnUiThread,因为onPostExecute是在ui线程上调用的
  • CustomDialog.java:310 是哪一行?
  • Toast.makeText(getActivity().getApplicationContext(), "为什么 onPostExecute 不起作用", Toast.LENGTH_SHORT).show();
  • “无法触摸视图...”问题的链接与此有何关系?请补充一些说明文字。

标签: java android multithreading android-asynctask


【解决方案1】:

使用 getActivity().runonUiThread 代替 activity.runOnUiThread

【讨论】:

  • 我做了:activity = (MainActivity) getActivity(); activity.runOnUiThread(new Runnable()
  • 这是一个旁注,但 getActivity() 是 Activity 内部的实例方法,您可以从内部类调用吗?
【解决方案2】:

正如@Raghunandan 正确提到的,onPostExecute 在 UI 线程上被调用,所以 runOnUiThread 不是必需的。

更改您的 AsyncTask 以在其构造函数中获取 Context:

private class DownloadFilesTask extends AsyncTask<String,String,String> {

    private Context context;
    public DownloadFilesTask(Context context) {
            super();
            this.context = context;
    }

并像这样使用它:

@Override
protected void onPostExecute(String result) {
        super.onPostExecute(result);

        Toast.makeText(context, 
                      "why onPostExecute not work", Toast.LENGTH_SHORT).show();

}

不要忘记使用上下文实例化 AsyncTask:

final DownloadFilesTask downloadTask = new DownloadFilesTask(getActivity());

【讨论】:

  • 仍然无法在 DialogFragment 中修改 UI onPostExecute
【解决方案3】:

问题比看起来要深得多。

真正的问题是因为我使用了 onPostExecute 中的 Toast.show() 和 dimiss() 对话框。 小延时(100ms)解决问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-16
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2012-01-07
    相关资源
    最近更新 更多