3

独自のアクティビティにある非同期タスクがあります。文字列値を渡すと、Webサービスに接続し、渡した名前に基づいてJsonデータをダウンロードして、Json結果セットを返します。よく働く。

asynctaskにプログレススピナーを追加したいのですが、その方法に困惑しています。私はこれと他の多くのブログを熟読し、近づいてきましたが、まだ解決策を見つけていません。コンテキストを取得するには、Activityクラスにasynctaskを含める必要があるか、コンテキストをパラメーターとして渡す必要があるようですが、入力パラメーターはStringである必要があります。文字列とコンテキストパラメータを保持できるオブジェクトを構築する可能性について読んだことがありますが、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を初期化するアクティビティのレイアウトにProgressBar(これは実際には呼ばれています。スピナーはAndroidのドロップダウンメニューのようなものです)を追加します。

次に、プログレスバーを開始および停止する2つの関数startProgress()とを作成します。stopProgress()

初期化または実行中にアクティビティを送信するか、asyncTaskで関数を作成してsetActivity(MyActivity activity)、AsyncTaskの初期化と実行の間に呼び出すことにより、AsyncTaskにアクティビティへの参照を与えます。

を呼び出すおよび呼び出すonPreExecute()AsyncTaskのをオーバーライドします。activity.startProgress()onPostExecute()activity.stopProgress()

編集:AsyncTaskのコンストラクターでProgressBarへの参照を渡すこともできます。アクティビティのメソッドでProgressBarへの参照を取得し、onCreate()それをAsyncTaskコンストラクターに追加します。AsyncTaskのonPreExecute()andメソッドで、それに応じてプログレスバーを開始および停止します。onPostExecute()

于 2012-09-13T11:39:13.037 に答える
0

AsyncTask1つだけでなく、さまざまなパラメータをに渡すことができます。

これを行う1つの方法は、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、データのダウンロードが完了したら、その可視性をに設定します。

つまり、メソッドでデータをダウンロードしてから、メソッドでImageViewsdoInBackgroundの可視性をに変更しますView.GONEonPostExecute

于 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 に答える