AsyncTask 内的数据库操作中未出现进度对话框

Posted

技术标签:

【中文标题】AsyncTask 内的数据库操作中未出现进度对话框【英文标题】:Progress dialog not appearing in database operation inside AsynTask 【发布时间】:2017-03-21 17:56:12 【问题描述】:

我正在 AysncTask 内的应用程序的本地数据库中插入一些数据,但是在执行课程时,进度对话框没有显示在屏幕上,而我可以看到运行日志。我看到很多相关的答案,但问题没有解决。我阅读了 .get() 方法阻止了 ui,但我已经没有使用这种方法。我不知道为什么它没有显示在屏幕上

从主 Activity 调用异步类

 AsyncGetDataFromServer task = new AsyncGetDataFromServer(this);
 task.execute();

AsyncTask 类的代码

public class AsyncGetDataFromServer extends AsyncTask<Void, Void, Boolean> 

ProgressDialog pd;
Context cxt;
DatabaseHandler dbHelper;
private static ArrayList<DataModel> categoryArrayList;

public AsyncGetDataFromServer(Context context) 
    // TODO Auto-generated constructor stub
    cxt= context;
    pd = new ProgressDialog(cxt);
    pd.setTitle("Please wait");
    pd.setMessage("Loading...");
    pd.setCancelable(false);
    dbHelper = new DatabaseHandler(cxt);


@Override
protected Boolean doInBackground(Void... params)

    try 
        Log.d("do in background","true");

                for (int i = 0; i < response.body().getVideoEntity().size(); i++) 
                    //inserting in categories
                    VideoEntity videoEntity;
                    videoEntity = response.body().getVideoEntity().get(i);
                    dbHelper.insertChannels(videoEntity);
                        
            

     catch (Exception e) 
        // TODO Auto-generated catch block
        Log.e("exception error", e.getMessage());
    

    return true;


@Override
protected void onPreExecute() 
    super.onPreExecute();
    Log.d("on pre execute","true");
    pd.show();


@Override
protected void onPostExecute(Boolean result) 
    super.onPostExecute(result);
    Log.d("on post execute","true");
    pd.dismiss();

【问题讨论】:

将所有写在构造函数中的代码放到onPreExecuate方法中,然后chk并移除那个构造函数 我已经测试过了,但是没有用。 用上面的代码试试这个新的 AsyncGetDataFromServer().execute(); @Sumant 一开始闪过就消失了。 G8.. 看看你的循环执行了多少次?如果你想要更多的时间,暂时只是添加计时器到 chk,进度对话框会显示几秒钟 【参考方案1】:

将 Activity 而不是上下文传递给构造函数。例如-

    AsyncGetDataFromServer task = new AsyncGetDataFromServer(MyActivity.this);
 task.execute();

【讨论】:

【参考方案2】:

你应该实现方法onProgressUpdate并使用方法publishProgress

见https://developer.android.com/reference/android/os/AsyncTask.html

【讨论】:

【参考方案3】:

在 onPreExecute() 方法中显示对话框并在 onPostExecute() 方法中关闭:

private class AsyncGetDataFromServer extends AsyncTask<Void, Void, Boolean> 
  private final ProgressDialog dialog = new ProgressDialog(YourClass.this);

  protected void onPreExecute() 
     this.dialog.setMessage("Loading...");
     this.dialog.show();
  

  protected void doInBackground(final Void unused) 
     //don't interact with the ui!
  

  protected void onPostExecute(final Boolean result) 
     if (this.dialog.isShowing()) 
        this.dialog.dismiss();
     
  

【讨论】:

以上是关于AsyncTask 内的数据库操作中未出现进度对话框的主要内容,如果未能解决你的问题,请参考以下文章

AsyncTask onPreExecute() 中未显示进度条

Android - 在 AsyncTask 执行时显示进度对话框

Android - 仅在 AsyncTask 未完成时单击按钮时显示进度对话框

进度对话框未更新

asynctask 自定义进度对话框

在 AsyncTask 中显示进度对话框