【问题标题】:Progress Dialog is not shown during execution of AsyncTask执行 AsyncTask 期间不显示进度对话框
【发布时间】:2014-08-22 10:26:28
【问题描述】:

我搜索了几个小时并尝试了 Stack Overflow 的所有答案,但没有解决我的问题。

我制作了 android 程序以完美运行以字节为单位下载数据。并用于在后台线程上工作的下载。我想显示一个进度对话框(只是旋转一个)。但我遇到了非常烦人的问题。我的下载大约需要 5 秒,但我的进度对话框没有显示或仅显示最后 1 秒。

这是我的 AsyncTask 代码。

public class ImageJSON extends AsyncTask<String, String, byte[]> {

private JSONObject jsonObject = new JSONObject();
private byte[] response;

 private ProgressDialog pg; 
 private Context context; 

 public ImageJSON(Activity activity) {
     pg = new ProgressDialog(activity);
 }
@Override 
protected void onPreExecute() { 
    super.onPreExecute();
    pg.setMessage("Downloading, please wait.");
    pg.show(); 
} 

@Override 
protected void onProgressUpdate(String... progress) {
    super.onProgressUpdate(progress);
    if (pg != null) { 
        pg.setProgress(Integer.parseInt(progress[0])); 
    } 
}

protected void onPostExecute(byte[] result) { 
    if (pg.isShowing()) { 
        pg.dismiss(); 
    } 
}
@Override
protected byte[] doInBackground(String... params) {
    HttpPost httpPost = new HttpPost("my file url....");
    HttpClient httpClient = new DefaultHttpClient();
    HttpContext httpContext = new BasicHttpContext();
    try {
        jsonObject.put("imageId", params[0]);

        StringEntity stringEntity = new StringEntity(jsonObject.toString());
        httpPost.addHeader("Content_Type", "application/octet_stream");
        httpPost.setEntity(stringEntity);

        HttpResponse httpResponse = httpClient.execute(httpPost, httpContext);
        HttpEntity entity = httpResponse.getEntity();

        if (entity!=null) {
            response = EntityUtils.toByteArray(entity);
            entity.consumeContent();
            httpClient.getConnectionManager().shutdown();
        }
    } catch (JSONException|IOException e) {
        e.printStackTrace();
    }
    return response;
}

我使用此代码从我的活动中调用它。

final ImageJSON imageTask = new ImageJSON(ReaderActivity.this);
byte[] response = imageTask.execute(imageId).get();

如果有人可以帮助我,在此先感谢。

【问题讨论】:

  • 我们评论progressupdate方法时,试试看是否出现进度对话框?
  • 不要调用 execute().get();它会阻止用户界面
  • 取消注释 onProgressUpdate 没有帮助,但删除 get() 方法可以解决问题....thnx.

标签: android android-asynctask progressdialog


【解决方案1】:

您不想使用get(),因为它仍然会冻结您的 UI 线程,从而否定使用AsyncTask 的意义。您可能希望实现 onPostExecute 以正确返回结果。

【讨论】:

  • 我明白了... get() 正在冻结 UI 线程...使用 onPostExecute 比使用 jsonObj.getString() 更好地处理结果......thnx
【解决方案2】:

试试这个 -

public ImageJSON(Activity activity) {

 }
@Override 
protected void onPreExecute() { 
    super.onPreExecute();
pg = new ProgressDialog(ReaderActivity.this);
    pg.setMessage("Downloading, please wait.");
    pg.show(); 
} 

【讨论】:

    【解决方案3】:

    你忘记在 onPreExecute 方法中初始化你的 progressDialogue

    @Override 
    protected void onPreExecute() { 
        super.onPreExecute();
    pg = new ProgressDialog(pass_context_here);
        pg.setMessage("Downloading, please wait.");
        pg.show(); 
    } 
    

    【讨论】:

      【解决方案4】:

      改变这个

      public ImageJSON(Context ctx) {
       this.context = ctx;
      
      }
      

      现在在你的onPreExecute() 方法中使用这个

      @Override 
      protected void onPreExecute() { 
       super.onPreExecute();
       pg = new ProgressDialog(context);
       pg.setMessage("Downloading, please wait.");
       pg.show(); 
       } 
      

      您在 ImageJSON 类中初始化您的 ProgressDialog,这会阻止您的 UI 线程意味着冻结它。所以需要在onPreExecute()方法中结合上下文进行初始化。

      【讨论】:

      • 一个Activity就是一个Context,所以没有区别。此外,onPreExecute() 在 UI 线程上运行,因此也没有什么不同。
      • 我知道是一样的。根据 OPs 的问题,这将是我的答案。
      猜你喜欢
      • 2019-12-31
      • 1970-01-01
      • 2018-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多