0

私はほとんどすべての同様のトピックを読みましたが、解決策を見つけることができませんでした。それで、私は自分自身に尋ねることに決めました。

ファイルをダウンロードして、操作中に進行状況ダイアログを表示したい。ファイルは正常にダウンロードされます。

最初の問題は、ダウンロード操作中にプログレスバーが更新されないことです。%0のままで、ダウンロードが完了すると、ダイアログは期待どおりに消えます。

2番目の問題は、これに偶然気づいたことです。アクティビティが更新されると(たとえば、画面の向きが変更された場合)、ダイアログは消えますが、ダウンロードは続行されます。

誰かが助けてくれることを願っています。

これが私のコードです:

package com.mehmetakiftutuncu.downloadunzipshow;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.net.URLConnection;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener
{
    final String LOG_TAG = "DownloadUnzipShow";

    final String RELATIVE_PATH = "mehmetakiftutuncu";
    final String FILE_NAME = "...";
    final String FILE_URL = "...";
    final String FULL_PATH = Environment.getExternalStorageDirectory().getPath() + "/" + RELATIVE_PATH + "/";;

    Button buttonDownload, buttonUnzip, buttonShow;
    ProgressDialog progressDialog;

    public class MyFileDownloader extends AsyncTask<String, String, String>
    {
        boolean isSuccessful = true;

        InputStream inputStream;
        OutputStream outputStream;

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

            Log.d(LOG_TAG, "Downloading: " + FILE_URL + " to " + FULL_PATH + FILE_NAME);
        }

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

            try
            {
                URL url = new URL(params[0]);
                URLConnection connection = url.openConnection();

                connection.connect();

                int lengthOfFile = connection.getContentLength();

                File path = new File(FULL_PATH);
                if(!path.exists())
                {
                    path.mkdir();
                }

                inputStream = new BufferedInputStream(url.openStream());
                outputStream = new FileOutputStream(FULL_PATH + FILE_NAME);

                byte[] data = new byte[1024];

                long total = 0;
                int percentage = 0;

                while((count = inputStream.read(data)) != -1)
                {
                    total += count;

                    percentage = (int) ((total / lengthOfFile) * 100);

                    publishProgress(String.valueOf(percentage));

                    outputStream.write(data, 0, count);
                }

                outputStream.flush();
                outputStream.close();
                inputStream.close();
            }
            catch(Exception e)
            {
                isSuccessful = false;
                Log.e(LOG_TAG, "An error occured while downloading. Details: " + e.getMessage());
            }

            return null;
        }

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

            progressDialog.setProgress(Integer.parseInt(values[0]));
        }

        @Override
        protected void onPostExecute(String result)
        {
            super.onPostExecute(result);

            if(isSuccessful)
            {
                Log.d(LOG_TAG, "File is successfully downloaded to: " + FULL_PATH + FILE_NAME);
            }

            progressDialog.dismiss();
        }
    }

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

        buttonDownload = (Button) findViewById(R.id.button_download);

        buttonDownload.setOnClickListener(this);
    }

    private void prepareProgressDialog()
    {
        progressDialog = new ProgressDialog(this);
        progressDialog.setTitle(getString(R.string.dialog_title));
        progressDialog.setMessage(getString(R.string.dialog_message) + FILE_URL);
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        progressDialog.setMax(100);
        progressDialog.setCancelable(false);
        progressDialog.show();
    }

    @Override
    public void onClick(View v)
    {
        switch(v.getId())
        {
            case R.id.button_download:
                new MyFileDownloader().execute(FILE_URL);
                break;
        }
    }
}
4

2 に答える 2

3

最初の問題は、ダウンロード操作中にプログレスバーが更新されないことです。%0のままで、ダウンロードが完了すると、ダイアログは期待どおりに消えます。

それは次の理由で起こっています:

percentage = (int) ((total / lengthOfFile) * 100);

がより小さい0整数のJava除算を実行しているため、常に戻ります。値を作ります。また、パーセンテージをとしてキャストしないでください。の2番目の一般的な引数をに変更してください。totallengthOfFiletotaldoubleStringAsyncTaskInteger

2番目の問題は、これに偶然気づいたことです。アクティビティが更新されると(たとえば、画面の向きが変更された場合)、ダイアログは消えますが、ダウンロードは続行されます。

構成の変更(ローテーションなど)では、Activityが再作成され、プロセス中のダイアログが強制終了されます。ダイアログを再表示する場合は、 (またはフラグメントを使用して)のメソッドにAsyncTask渡すことにより、構成の変更全体を維持する必要があります。メソッドでを使用して、タスクが保持され、まだ実行されているかどうかを確認し、ダイアログを再表示します。また、アクティビティに関連付けるため、内部クラスを作成するべきではありません。onRetainNonConfigurationInstance()ActivityonCreategetLastNonConfigurationInstanceAsyncTaskActivity

于 2013-01-25T19:37:02.190 に答える
0

ダイアログが消える-向きの設定の変更をキャプチャしていますか、それともAndroidに許可していますか?Androidにそれをさせている場合、それはあなたの活動を殺してそれを再作成し、それはあなたのダイアログを破壊するでしょう。非同期タスクはシステムによって所有されているため、非同期タスクは強制終了されません。これを修正するには、アクティビティのマニフェストにandroid:configChange="orientation"を追加します。一般的な経験則では、回転を通じてダイアログを持続させたい場合は、それを行う必要があります。

于 2013-01-25T19:13:45.940 に答える