【问题标题】:Unable to dismiss progress dialog in postexecute method in Fragment无法在 Fragment 的 postexecute 方法中关闭进度对话框
【发布时间】:2014-01-09 11:46:06
【问题描述】:

Asynctask 中的 onPostExecute 方法没有被调用,progressdialog 也没有被关闭。我也没有任何例外。任何帮助将不胜感激。
这是我的代码

 public class ParseAsync extends AsyncTask<String, Void, Void> 
{
    ProgressDialog pDialog = null;
    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();
        pDialog = ProgressDialog.show(getActivity(), "", "Loading.....", true, false);
    }

    @Override
    protected Void doInBackground(String... params) 
    {
        RSSFeedXMLParser parser = new RSSFeedXMLParser();
        String urls = params[0]; 
        parser.parsedata(urls);
        return null;
    }

    @Override
    protected void onPostExecute(Void result) 
    {
         pDialog.dismiss();
         listAdapter = new ListAdapter(getActivity());
         lvnewsfeed.setAdapter(listAdapter); 
    }   

}

我在 oncreateview 方法中调用 asynctask,如下所示:

new ParseAsync().execute("rssfeedurl");

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

    为您的 ParseAsync 类创建一个构造函数

    Context ctx;
    
    public ParseAsync (Context mContext) {
        this.ctx = mContext;
    }
    

    现在将这个 ctx 变量传递给 ProgressDialog 一个 Context 参数。

    @Override
    protected void onPreExecute() 
    {
        super.onPreExecute();
        pDialog = ProgressDialog.show(ctx, "", "Loading.....", true, false);
    }
    

    【讨论】:

      【解决方案2】:

      你好,请留言

      dialog = new ProgressDialog(context);

      在异步任务中添加这些行

      public ParseAsync (YoursActivity activity) {
              this.activity = activity;
              dialog = new ProgressDialog(activity );
          }
      

      【讨论】:

      • 我使用的是片段而不是活动,我尝试了这个,但它不起作用。公共 ParseAsync (上下文上下文) { context = getActivity(); pDialog = new ProgressDialog(context); }
      【解决方案3】:

      尝试将此添加到您的课程中...

      ParseAsync(String urlPass) {
                  url = urlPass;
              }
      

      并像这样启动您的 AsyncTask ..

      new ParseAsync(urlTopass).execute();
      

      例如:

      private class connectAsyncTask extends AsyncTask<Void, Void, String> {
              private ProgressDialog progressDialog;
              String url;
      
              connectAsyncTask(String urlPass) {
                  url = urlPass;
              }
      
              @Override
              protected void onPreExecute() {
                  // TODO Auto-generated method stub
                  super.onPreExecute();
                  progressDialog = new ProgressDialog(context);
                  progressDialog.setMessage("Fetching route, Please wait...");
                  progressDialog.setIndeterminate(true);
                  progressDialog.show();
              }
      
              @Override
              protected String doInBackground(Void... params) {
                  JSONParser jParser = new JSONParser();
                  String json = jParser.getJSONFromUrl(url);
                  return json;
              }
      
              @Override
              protected void onPostExecute(String result) {
                  super.onPostExecute(result);
                  progressDialog.hide();
                  if (result != null) {
                      drawPath(result);
                  }
              }
          }
      

      【讨论】:

        【解决方案4】:

        您需要一个返回类型才能让onPostExecute() 被调用。您可以将 Void 返回类型更改为 String 并返回一个简单的“完成”字符串。这样onPostExecute() 就会被调用。

        【讨论】:

        • @Raghunandan 您运行的是哪个 Android 版本?
        • @Raghunandan 如果您是 Jellybean 之前的用户,请看一下:AsyncTask 类必须加载到 UI 线程上。这是从 JELLY_BEAN 自动完成的。如果您还没有使用 Jellybean,您会手动执行此操作吗?
        • onCreateView 中调用异步任务不在ui 线程上?引用 op“我在 oncreateview 方法中调用 asynctask,如下所示:new ParseAsync().execute("rssfeedurl")
        • 看看这个帖子,特别是第二个答案:stackoverflow.com/questions/4494720/…它更详细地解释了这个问题。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多