【问题标题】:AsyncTask Progress Dialog Not Showing When I Launch My Activity启动 Activity 时未显示 AsyncTask 进度对话框
【发布时间】:2015-10-04 06:22:58
【问题描述】:

我的 AsyncTask 中有一个方法,其中包含从 Parse.com 加载的数据 我想要的是让我的进度对话框显示,直到所有数据完全加载。

因此,如果加载数据需要 5 分钟,则进度对话框应显示该确切时间,直到所有数据完成加载。

我尝试了许多其他使用 AsyncTask 的不同方法,但仍然没有解决方案。

这很重要,谁能帮我解决这个问题

在我的 Main Activity 的 onCreate 中:

ProgressDialog progress = new ProgressDialog(this);
new MyTaskUpcomingShows(progress).execute();

我的带有进度对话框的 AsycTask:

class MyTaskUpcomingShows extends AsyncTask<Void, Void, Void> {

    ProgressDialog progress;

    public MyTaskUpcomingShows(ProgressDialog progress) {
        this.progress = progress;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progress.setMessage("Loading...");
        progress.show();
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        parseQueryUpcomingShowsEventsTable();
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        progress.dismiss();
    }

}

其他信息:

当我尝试以这种方式执行我的 AsyncTask 时,它显示但只是因为 Thread.sleep

    private class BackgroundTask extends AsyncTask <Void, Void, Void> {
private ProgressDialog dialog;

public BackgroundTask(MyMainActivity activity) {
    dialog = new ProgressDialog(activity);
}

@Override
protected void onPreExecute() {
    dialog.setMessage("Doing something, please wait.");
    dialog.show();
}

@Override
protected void onPostExecute(Void result) {
    if (dialog.isShowing()) {
        dialog.dismiss();
    }
}

@Override
protected Void doInBackground(Void... params) {
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    return null;
}

}

问题是,如果我这样做,如果我删除了进度对话框,则不会显示 线程.sleep(5000)

此外,如果数据在 5 秒之前加载,进度对话框仍会旋转。它应该在加载数据后立即停止

【问题讨论】:

  • 为什么要设置两次消息?? @casguapo
  • 需要看progressdialog类
  • @Paudel 我也试过这种方式 MyTaskUpcomingShows task = new MyTaskUpcomingShows();任务.执行();它仍然没有工作......我想这是设置消息两次的错误,但我确实删除了它并尝试这种方式,它仍然没有工作
  • @Cardoso 你到底是什么意思?进度对话框仅在 onCreate 之外的两个地方进行操作,您正在查看“class MyTaskUpcomingShows extends AsyncTask”,然后使用“ProgressDialog progress = new ProgressDialog(this); progress.setMessage( "加载中..."); new MyTaskUpcomingShows(progress).execute();" ....所以它在其他任何地方都找不到
  • 你所说的与需要查看进度对话框类无关,但我假设 ProgressDialog 是一个 DialogFragment 所以没关系抱歉

标签: android android-asynctask progressdialog


【解决方案1】:

看来你需要的是这个

class MyTaskUpcomingShows extends AsyncTask<Void, Void, Void> {

    ProgressDialog progress;

    public MyTaskUpcomingShows() {
        //nothing
    }

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

【讨论】:

    【解决方案2】:

    问题可能是您用于创建进度对话框的上下文。

    试试 YourClassName.this 作为上下文

    public class MainActivity extends AppCompatActivity{
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        new MyAsyncTask(MainActivity.this).execute("");
    
    }
    
    
    class MyAsyncTask extends AsyncTask<String,Void,List<Order>>
    {
        Context _context ;
        ProgressDialog progressDialog;
    
        public MyAsyncTask(Context context)
        {
            this._context = context;
        }
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            progressDialog = ProgressDialog.show(_context, "TITLE","MESSAGE");
        }
    
        @Override
        protected List<Order> doInBackground(String... strings) {
    
        // load your data 
            return null;
        }
    
        @Override
        protected void onPostExecute(List<Order> orders) {
            super.onPostExecute(orders);
    
            progressDialog.dismiss();
    
        // do your stuff
    
    
    
        }
    } // END OF ASYNC TASK
    } // END OF MainActivity
    

    【讨论】:

    • @casguapo 你能提供你的活动代码吗?使用 onCreate 方法调用此 AsyncTask。并检查 logcat 看看是否有任何错误?
    • 阅读我上面的帖子,我没有收到任何错误。出于某种原因,如果我应该以另一种方式执行 AsyncTask(我在上面提供的示例),使用 Thread.sleep() 会暂停 ui 线程并显示对话框,但问题是如果加载数据,对话框不会停止或者可能在数据加载之前停止...
    • 所有相关代码均已发布。唯一的另一段代码是方法“parseQueryUpcomingShowsEventsTable();” ....所有包含的是从解析获取数据的查询
    • 这是代码对我来说工作正常。我从我的项目中复制了这个。 doInBackground 在与 UI 线程不同的线程上调用...因此在 doInBackground 方法中调用 sleep 方法不应影响进度对话框(根据我的理解)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2017-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多