如何在Android中使用当前上传百分比加载第二次应用时更新ProgressBar

时间:2014-01-15 13:45:45

标签: android android-asynctask android-progressbar

我正在尝试实现显示ProgressBar更新的简单应用。以下是我的主要任务。

  • 当app首次加载并使用AsyncTask启动ProgressBar上传时,它应显示在UI上(完成并正常工作)

  • 在更新ProgressBar时,用户从应用程序退出,上传值应该增加,因为它在AsyncTask上运行(完成并正常工作)

  • 下次应用加载时,如果仍有更新并运行AsyncTasks(问题)

  • ,则ProgressBar应从当前更新进度值开始

以下是我的代码的一部分;

public class PUMainActivity extends Activity implements ProgUpAsync.MyThreadListener {

    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.pumain_activity);

        progressBar = (ProgressBar) findViewById(R.id.pumainActivity_progressBar);
    }

    @Override
    public void onTextViewChanging(final int progValue) {

        runOnUiThread(new Runnable() {

            @Override
            public void run() {

                progressBar.setProgress(progValue);
            }
        });
    }
}

由于我已经实现了监听器,我可以在我的应用加载时第二次获得当前进度。但ProgressBar UI没有更新。没有编译/运行时错误。

使用侦听器接口更新


以下是侦听器的实现

public class ProgUpAsync extends AsyncTask<Void, Integer, Void> {

    private MyThreadListener mCallback;

    public interface MyThreadListener {
        public void onTextViewChanging(int progValue);
    }

    public ProgUpAsync(Activity paramActivity) {

        try{
            mCallback = (MyThreadListener) paramActivity;
        }catch(ClassCastException e){
            throw new ClassCastException(paramActivity.toString() + " must implement MyThreadListener");
        }
    }

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

        for(int i=0; i<=100; i++){
            if((i%5) == 0){
                publishProgress(i);

                try {
                    Thread.sleep(5000);
                } catch (InterruptedException ie) {
                }
            }
        }

        return null;
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);

        mCallback.onTextViewChanging(values[0]);
    }
}

2 个答案:

答案 0 :(得分:0)

问题是在重新启动应用程序后无法检索对ProgUpAsync的引用。也许你必须看到在服务中翻译它。这是做什么样的更新过程。

答案 1 :(得分:0)

最后我做到了。这是我为完成任务而添加的代码。

ProgUpAsync ./ava

public void setMainActivity(Activity paramActivity){

    try{
        mCallback = (MyThreadListener) paramActivity;
    }catch(ClassCastException e){
        throw new ClassCastException(paramActivity.toString() + " must implement MyThreadListener");
    }
}

并在 PUMainActivity .java

    try{
        if(progUpAsync.getStatus() == AsyncTask.Status.RUNNING){
            if(PuConstants.debugEnable)Log.d(TAG, "# Async is RUNNING");
            progUpAsync.setMainActivity(this);
        }else{
            if(PuConstants.debugEnable)Log.d(TAG, "# Async is NOT running");
            progUpAsync = new ProgUpAsync(this);
            progUpAsync.execute();
        }
    }catch(NullPointerException npe){
        if(PuConstants.debugEnable)Log.w(TAG, "@ Exception caz of progUpAsync : " + npe);
        progUpAsync = new ProgUpAsync(this);
        progUpAsync.execute();
    }