代码之家  ›  专栏  ›  技术社区  ›  Kamil Nękanowicz

从onPostExecute调用时更改UI崩溃

  •  -1
  • Kamil Nękanowicz  · 技术社区  · 11 年前

    我无法在中修改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

    3 回复  |  直到 8 年前
        1
  •  0
  •   Kapil Vats    11 年前

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

        2
  •  0
  •   Sam R. chikka.anddev    11 年前

    正如@Raghunandan正确提到的, onPostExecute 在UI线程上调用,因此 runOnUiThread 不需要。

    更改AsyncTask以在其构造函数中获取上下文:

    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());
    
        3
  •  0
  •   Kamil Nękanowicz    11 年前

    问题比看起来要严重得多。

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