1

I need to load a image by URL, set in the ImageView and save the file in the SD Card.

This class do that, but very slowly.... The jpg files have 60kb, and the time to download its 3~6 seconds in my 10Mbps internet connection...

I'm using this to load any images in a listview...

public class DownloadImageTask extends AsyncTask {

ImageView bmImage;
String path;
String filename = "pg0.rsc";
String param;
Context context;

public DownloadImageTask(Context context, ImageView bmImage, String param, String code) {
    this.bmImage = bmImage;
    this.param = param;
    this.path = Environment.getExternalStorageDirectory().toString() + "/.RascunhoCache/." + code + "/";
    this.context = context;
}

protected Bitmap doInBackground(String... urls) {
    String urldisplay = urls[0];
    Bitmap mIcon11 = null;
    try {
        InputStream in = new java.net.URL(urldisplay).openStream();
        mIcon11 = BitmapFactory.decodeStream(in);
    } catch (Exception e) {
        Log.e("Error", e.getMessage());
        e.printStackTrace();
    }
    return mIcon11;
}

protected void onPostExecute(Bitmap result) {       
    bmImage.setImageBitmap(result);
    if(param.equals("c")){
        OutputStream outStream = null;
        new File(path).mkdirs();
        File file = new File(path, filename);
        try {
         outStream = new FileOutputStream(file);
         result.compress(Bitmap.CompressFormat.JPEG, 100, outStream);
         outStream.flush();
         outStream.close();
        }
        catch(Exception e){}
    }
}

}

4

1 に答える 1

1

データを直接デコードしないでください。最初にディスクに保存します。

画像をデコードするために、JPEG デコードでストリームを前後に移動する必要があるとします。それがどれほど遅いか想像できますか (場合によっては不可能です)。

apache の IOUtils を使用して、ストリームとファイルを支援します。

実行後のメソッドを見てください。これはメイン スレッドで実行され、コードの実行中に UI がフリーズします。AsyncTask を使用してビットマップを操作しますが、UI スレッドを軽くするために使用するため、doInBackground 内でエンコード/デコード/時間のかかる操作を行います。

また、catch 句で何かを行います。空のままにしておくのは非常に悪い習慣です。アプリは、何かがうまくいかなかったことを知る機会がありません。回復するか、少なくともユーザーに通知するか、何かをログに記録する必要があります。

そして最後に、このスレッドを見る必要があります。ネットワークには asynctask よりも優れたアプローチがあり、いくつかのかなり優れたライブラリが大いに役立ちます。

于 2013-10-21T01:04:32.783 に答える