3

我有一个在自己的活动中的异步任务。我向它传递一个字符串值,它连接到我的 Web 服务并根据我传入的名称下载 Json 数据,返回 Json 结果集。效果很好。

我想在异步任务中添加一个进度微调器,但我不知道该怎么做。我仔细阅读了这个和许多其他博客,并接近但尚未找到解决方案。看来我要么需要将异步任务与 Activity 类一起获取上下文,要么必须将上下文作为参数传递——但我需要输入参数是字符串。我已经阅读了构建一个可以保存字符串和上下文参数的对象的可能性,但是我对 Java 很陌生,不知道如何构建类似的东西,也没有找到一个很好的解释来说明如何这样做。所以经常有一个解释符合我的需要,然后说,“......然后你做X,就是这样,”当X是我需要知道的。

我想要的只是一个在下载发生时旋转的旋转器。没有文字,没有对话,只有一个微调器。

4

4 回答 4

2
class MyTask extends AsyncTask<Request, Void, Result> {

 protected ProgressDialog progressDialog;

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

    @Override protected Boolean doInBackground(Request... params) {
        // do some work here 
            return true;
    }

    @Override protected void onPostExecute(Result res) {
        progressDialog.dismiss();
    }
}
于 2012-09-13T11:44:45.740 回答
1

在初始化 AsyncTask 的 Activity 布局中添加一个 ProgressBar(这实际上是它的名称,Spinners 就像 Android 中的下拉菜单)。

然后制作两个函数startProgress()stopProgress(),它们启动和停止进度条。

通过在初始化或执行期间发送它,或者在 asyncTask 中创建一个函数setActivity(MyActivity activity)并在 AsyncTask 初始化和执行之间调用它,为您的 AsyncTask 提供对 Activity 的引用。

覆盖onPreExecute()您的 AsyncTask 以调用activity.startProgress()onPostExecute()调用activity.stopProgress()

编辑:您还可以尝试在 AsyncTask 的构造函数中传递对 ProgressBar 的引用。在活动的方法中获取对 ProgressBar 的引用onCreate(),然后将其添加到 AsyncTask 构造函数中。在 AsyncTask 的onPreExecute()onPostExecute()方法中,相应地启动和停止进度条。

于 2012-09-13T11:39:13.037 回答
0

您可以将各种参数传递给一个AsyncTask,而不仅仅是一个!

一种方法是在 AsyncTask 中创建成员变量,并使用接受参数的构造函数对其进行初始化。例如:

private class MyAsyncTask extends AsyncTask<null, null, null> {
String mFirstParam = null;
Context mContext = null;
// Constructor which accepts parameters
public MyAsyncTask(String _firstParam, Context _context){
 this.mFirstParam = _firstParam;
 this.mContext = _context;
 }
}

当您创建 的实例时AsyncTask,按如下方式创建它:

MyAsyncTask task = new MyAsyncTask(myFirstStringParam, mySecondContextParam);
task.execute();

现在,您可以在AsyncTask.

完成下载数据后,考虑传递ImageView“加载”图像的包含并将其可见性设置为。View.GONE

即在方法中下载您的数据,doInBackground然后在方法中将 ImageViews 可见性View.GONE更改onPostExecute

于 2012-09-13T11:35:04.037 回答
0

我认为您可以在其构造函数中创建进度条实例时将其传递给 AsyncTask。这是使用 AsyncTask 的下载器示例 -

public void downloadFile(String url, String path, ProgressDialog progress) {

    DownloadFileAsync downloader = new DownloadFileAsync(progress);

    File file = new File(path);

    if (file.exists()) {
        file.delete();
    }

    downloader.execute(url, path);
}

class DownloadFileAsync extends AsyncTask<String, String, String> {

    private final WeakReference<ProgressDialog> progressbarReference;

    public DownloadFileAsync(ProgressDialog progress) {
        progressbarReference = new WeakReference<ProgressDialog>(progress);
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }

    @Override
    protected String doInBackground(String... aurl) {
        int count;

        try {

            URL url = new URL(aurl[0]);
            URLConnection conexion = url.openConnection();
            conexion.connect();

            int lenghtOfFile = conexion.getContentLength();

            /*
             * android.util.Log.v("downloadFile", "Lenght of file: " +
             * lenghtOfFile + ":" + aurl[1]);
             */
            InputStream input = new BufferedInputStream(url.openStream());
            OutputStream output = new FileOutputStream(aurl[1]);

            try {
                byte data[] = new byte[1024];

                long total = 0;

                while ((count = input.read(data)) != -1) {
                    total += count;
                    publishProgress(""
                            + (int) ((total * 100) / lenghtOfFile));
                    output.write(data, 0, count);
                }

            } finally {

                if (output != null) {
                    output.flush();
                    output.close();
                }

                if (input != null) {

                    input.close();
                }
            }
        } catch (Exception e) {

            ProgressDialog p = null;

            if (progressbarReference != null) {
                p = progressbarReference.get();
            }

            if (p != null && p.isShowing()) {
                p.dismiss();
            }
        }
        return null;

    }

    protected void onProgressUpdate(String... progress) {
        if (progressbarReference != null) {
            ProgressDialog p = progressbarReference.get();

            if (p != null) {
                p.setProgress(Integer.parseInt(progress[0]));
            }
        }
    }

    @Override
    protected void onPostExecute(String unused) {

        ProgressDialog p = null;

        if (progressbarReference != null) {
            p = progressbarReference.get();
        }

        if (p != null && p.isShowing()) {
            p.dismiss();
        }

    }
}

ProgressDialog 是一个自定义对话框,里面有一个进度条。希望能帮助到你。

于 2012-09-13T12:38:16.057 回答