5

ネットワーク経由で取得した画像のリストを含むリスト ビューがあるアプリケーションをテストしています。Android デバイス 2.3.3 (WIFI 速度 512 KBPS) でアプリケーションを実行し、DDMS (スレッド ビューアー) を確認すると、スレッド数が 25 から 50 まで増加し続けます。しかし、デバイス 4.0 (WIFI 速度) で同じアプリケーションをテストすると、 5 MBPS)、スレッド数は増加しませんでした。

なぜこれが起こっているのか理解できる人はいますか?Android OSの違いによるものですか、それとも他の理由によるものですか?

前もって感謝します。

4

3 に答える 3

12

を使用していますかAsyncTask。Android 3.0 以降、 のデフォルトの動作は、AsyncTaskSERIAL_EXECUTOR を使用してシングル スレッドで実行されます。

AsyncTask任意のシステム バージョンで同時に実行する場合は、このコードを使用できます。

AsyncTask task = new YourTask();
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
    task.execute(params);
} else {
    task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
}

OS 1.6 より前 - 複数の非同期タスクが順番に実行されます。OS 1.6 から OS 2.3 まで - 非同期タスクは並行して実行されます。3.0 から - ここでも、非同期タスクが順番に実行されます。

于 2012-10-26T03:45:47.103 に答える
1

AsyncTask を使用してバックグラウンド操作を実行していますか? GB と ICS では AsyncTask の実装に違いがあると思います。

スレッドが作業を終了したときにデバッグ ログを追加して、2 つのバージョンに違いがあるかどうかを確認してください。

于 2012-10-26T03:35:53.927 に答える
0

11 未満の API には AsyncTaskCompat.executeInParallel を使用できます。このクラスは appcompat v4 ライブラリにあります。

使用例:

AsyncTaskCompat.executeParallel(new AsyncTask<Void, Void, Bitmap>() {
        @Override
        protected Bitmap doInBackground(Void... params) {
            return MediaStore.Images.Thumbnails.getThumbnail(
                    imageView.getContext().getContentResolver(),
                    id,
                    MediaStore.Images.Thumbnails.MINI_KIND,
                    null);
        }
        @Override
        protected void onPostExecute(Bitmap bitmap) {
            imageView.setImageBitmap(bitmap);
            if (bitmap != null) {
                // Add the image to the memory cache first
                CACHE.put(id, bitmap);
                if (listener != null) {
                    listener.onImageLoaded(bitmap);
                }
            }
        }
    });

楽しい

于 2015-07-12T06:59:28.770 に答える