0

ファイルを1つずつダウンロードするAsyncTaskがあり、Android 2.xで実行されている場合は、キューとして作成します。Android 4.0以降では、動作を停止します。ここでは、ProgressBarをAsyncTaskに渡したので、読み込みの進行状況バーが更新され、どこにあるかが示されます。

奇妙な部分は、プログレスバーが100%非常に速く進み、ファイルの実際のサイズと一致しないことです。そして、logcatのファイル出力の長さも間違っています...

すべてのタスクはシリアルに実行されるため、SDK 11を超える並列制限を損なうことはありません。問題はダウンロード部分にある可能性があり、どこにあるのかわからないだけです。

public function download ()
{
    .....
    if (task != null) {
        task.cancel (true);
    }
    task = new OnlineDownloadTask (progress);
    task.execute (url, path);
    .....
}

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

        private final WeakReference<OfflineQueueIndicatorView> progressbarReference;

        public OnlineDownloadTask(OfflineQueueIndicatorView progress) {
            progressbarReference = new WeakReference<OfflineQueueIndicatorView>(
                    progress);
        }

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

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

            try {

                URL url = new URL(aurl[0]);
                HttpURLConnection conn = (HttpURLConnection) url
                        .openConnection();
                conn.setConnectTimeout(10000);
                conn.setReadTimeout(10000);
                conn.setRequestMethod("GET");
                conn.setAllowUserInteraction(false);
                conn.setDoInput(true);
                conn.setDoOutput(true);
                conn.connect();

                int lengthOfFile = conn.getContentLength();

                android.util.Log.v("offline.downloader", lengthOfFile + "");
                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) / lengthOfFile));

                        if (stopoffline) {
                            android.util.Log.v("file.downloader", "stopped");
                            break;
                        }
                        output.write(data, 0, count);
                    }

                    if (stopoffline) {
                        output.flush();
                        output.close();
                        input.close();
                        conn.disconnect();
                        File file = new File(aurl[1]);

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

                        stopoffline = false;
                        return null;
                    } else {
                        output.flush();
                        output.close();
                        input.close();
                        conn.disconnect();

                        if (DiskCache.getInstance().offlineDirectoryExist(
                                DiskCache.getInstance().offlineCurrentFolder)) {

                        } else {
                            if (!DiskCache
                                    .getInstance()
                                    .makeOfflineFolder(
                                            DiskCache.getInstance().offlineCurrentFolder)) {
                                return null;
                            }
                        }

                        android.util.Log.v("offline",
                                DiskCache.getInstance().offlineCurrentFolder);
                        unzip(aurl[1],
                                DiskCache.getInstance().offlineCurrentFolder);
                        DiskCache.getInstance().deleteFile(aurl[1]);
                        return "succ";
                    }

                } finally {

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

                    if (input != null) {

                        input.close();
                    }

                    if (conn != null) {
                        conn.disconnect();
                    }
                }
            } catch (Exception e) {

                e.printStackTrace();

            }
            return null;

        }

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

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

            catch (Exception e) {
                e.printStackTrace();
            }
        }

        @Override
        protected void onPostExecute(String ret) {

            try {
                if (progressbarReference != null) {

                    if (ret != null) {
                        queue.get(currentId).put("state", "complete");
                    } else {
                        if (queue != null) {
                            if (currentId != null) {
                                queue.get(currentId).put("state", "failed");
                            }
                        }
                    }

                }
            }

            catch (Exception e) {
                e.printStackTrace();
            }

            download();

        }
    }
4

2 に答える 2

1

HttpUrlConnectionAndroid 4.0の新しいバージョンにより、サーバーがHTTP/1.1でサポートされているチャンク転送エンコーディングを使用している可能性があります。Android2.xバージョンはCTEをサポートしていない可能性があります。CTEを使用して応答を送信する場合(たとえば、ファイル/ビデオストリーミング中)、サーバーはコンテンツの長さを返しません。ProgressBarそのため、コンテンツの長さが利用できない場合は、不確定を表示することをお勧めします。

于 2012-11-12T18:10:23.567 に答える
0

削除した後、最終的に何が問題になっているのかがわかりましたconn.setDoOutput(true)。Android2.xと4.xの両方のエミュレーターでうまく機能します。また、acjにも問題があると思います。場合によっては、チャンク転送エンコーディングも理由です。

于 2012-11-13T06:41:39.837 に答える