【问题标题】:Delaying a Task and showing progress bar延迟任务并显示进度条
【发布时间】:2013-05-21 09:26:53
【问题描述】:

我似乎在兜圈子。 我有一些代码,即使在 Galaxy S3 上也需要几秒钟才能运行。从数据库中拖拽数据。 我想在这个周围添加一个进度条弹出窗口(旋转圆圈),让用户知道应用程序正在做某事。 我已经在应用程序的其他地方尝试过 Asyntasks 并且工作正常,但对于这种类型的主 UI 不会等待 Asyntask 完成后再继续,因此被调用的新活动没有它需要的所有数据并崩溃。

AsyncTask 是解决这个问题的最佳方法,还是有更简单的方法来暂停主 Activity,显示进度条,然后在长延迟完成后继续前进。

感谢您的时间

更新

public class UpdateDetailsAsyncTask extends AsyncTask<Void, Void, Boolean> {   

    private Context context;
    private TaskCallback callback;

    private ArrayList<Object> object;

    private ProgressDialog progress; 

    public UpdateDetailsAsyncTask (
            Context pContext, 
            ArrayList<Object> pObject,
            TaskCallback pCallback) {

        context = pContext;
        callback = pCallback;
        object = pObject;

    }

    @Override
    protected void onPreExecute() {

        Log.i("AsyncTask", "onPreExecuted");

        progress = new ProgressDialog(context);
        progress.setMessage(context.getResources().getString(R.string.loading));
        progress.show();

    }

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

        Log.i("Archery", "AsyncTask Excuted");
        Log.i("Archery Scorepad", "Building Continue Round Details");

        // Save Data to Database

        return true;

    }


    protected void onPostExecute(Boolean result) {

        Log.i("AsyncTask", "onPostExuted");

        progress.dismiss();

        callback.startNewActivity();

    }

}

从主 Activity 调用任务

new UpdateDetailsAsyncTask(this, ArrayListOfObjects, this).exute();

更新 2

..

更新 3

执行某些工作的代码调用 Util 类中的方法,该方法调用数据库类。我有日志消息显示我保存到数据库的所有数据行。它正确启动并运行,但似乎在数据库方法完成之前调用了 onPostExecute()。

我的问题是我在活动中嵌套了类,而任务似乎已经完成,而它下面的类还没有完成?

谢谢

【问题讨论】:

  • 可以发布,但主要代码是基本的,所以认为描述就可以了。
  • 你在找this

标签: android


【解决方案1】:

你必须从 Asyntask 切换到onPostExecute 中的下一个活动

【讨论】:

  • 有没有办法让 Anystask 作为一个独立的。我想在未来重复使用它。我已经尝试过回调,但在任务完成之前它仍在启动下一个代码
  • 是的。您可以使用 AsyncTask 创建一个类,并在构造函数中添加一个接口。然后在您的 onPostExecute 中,您可以调用将在您的活动中实现的接口
  • 来自您实现 MyCallBack 的活动:MyTask myTast = new MyTask(this); myTast.execute(); 在 onPostExecute:callBack.doSomeInActivity();
  • 我已经做到了。我使用 onPostExeute 中的接口进行回调,但在 inbackgroudtask 似乎完成之前调用了接口方法
  • onPostExeute 总是在 doInBackground 之后调用。也许您正在 doInBackground 中执行异步任务。如果所有进程在doInBackground中同步,onPostExeute总是会在doInBackground之后调用
【解决方案2】:

是的!

这里是一个简单的 AsuncTask 代码

private class LoadImageAction extends AsyncTask<String, String, String>{

    private Course course;
    private ProgressBar pb;

    public LoadImageAction(Course course, ProgressBar pb){
        this.course = course;
        this.pb = pb;
    }

    @Override
    protected void onPreExecute(){

    }

    @Override
    protected String doInBackground(String... arg0) {
        // TODO Auto-generated method stub

        return null;
    }

    @Override 
    protected void onProgressUpdate(String... string){


    }

    @Override
    protected void onPostExecute(String result){

    }
}

您可以通过

运行该操作
new LoadImageAction().execute();

【讨论】:

  • 这基本上是我所拥有的,但是在调用 onPostExecute() 之前,调用它的 Activity 似乎不会停止
  • 抱歉,有什么问题吗?在 doInBackground 完成时调用 onPostExecute。
  • 我在 Save Data to Database 中添加了一些调试消息,我可以看到在调用新活动并开始加载之前它没有完成
  • 您是否以正确的方式执行任务??或者您将数据保存到数据库的代码是否正确?因为我检查了你更新的代码。没有错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-14
  • 1970-01-01
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多