0

これを使用してダウンロードして保存した画像のファイルサイズを取得しようとしていますAsyncTask

protected Bitmap doInBackground(String... params) {
      String urldisplay = params[0];

      if(params[1] != null)
          newClan = params[1];

      if(params[2] != null){
          Context ctx = Home.getContext();

          prevClan = params[2];
          File f  = new File(ctx.getFilesDir(), prevClan + ".png");
          if(f.exists()){
              File d = f.getAbsoluteFile();
              d.delete();
          }
      }

      Bitmap emblem = null;

        try {
            //get emblem from url
            InputStream  in = new java.net.URL(urldisplay).openStream();
            emblem = BitmapFactory.decodeStream(in);
        } catch (MalformedURLException e) {
            Log.e(e.getClass().toString(), e.getMessage());
        } catch (IOException e) {
            Log.e(e.getClass().toString(), e.getMessage());
        }

      return emblem;
  }

  public static void saveImage(Bitmap img){

      Context ctx = Home.getContext();

      try {
        FileOutputStream out = new FileOutputStream(ctx.getFilesDir().getPath() + File.separatorChar + newClan + ".png");
        img.compress(Bitmap.CompressFormat.PNG, 100, out);
    } catch (FileNotFoundException e) {
    } catch (NullPointerException e1) {
        Log.e("NullPointerException DownloadImageTask", e1.toString());//TODO
    }
  }

これはそのように呼ばれます

File emblemPath = new File(ctx.getFilesDir(), clan + ".png");
    Log.e("image size", emblemPath.length()+"");//TODO

    if(emblemPath.exists()){
        emb.setImageDrawable(Drawable.createFromPath(emblemPath.toString()));
        Log.e("Image exists", "size = " + emblemPath.length());//TODO
    }
    else{
        String prevClan = pref.getString("prevClan", null);
        emb.setImageBitmap(Storage.updateClanEmb(embURL, clan, prevClan));
        Log.e("Image downloaded", "size = " + emblemPath.length());//TODO
    }

この直前に、必要な変数を提供するログイン画面があります。ダウンロードしたイメージは に正しく表示されImageViewますが、最初はファイル サイズが 0 です。ログアウトしてから再度ログインすると、正しいファイル サイズが表示されます。ログはここにあります:

- 05-25 04:52:32.973: E/result(22501): {"login":0,"clan":"Cosa Nostra","status":"0"}
- 05-25 04:52:32.984: E/Login success!(22501): Login success!
- 05-25 04:52:34.554: E/image size(22501): 0
- 05-25 04:52:35.953: E/Image downloaded(22501): size = 0
- 05-25 04:52:44.553: E/Logout(22501): Logged out
- 05-25 04:52:54.893: E/result(22501): {"login":0,"clan":"Cosa Nostra","status":"0"}
- 05-25 04:52:54.893: E/Login success!(22501): Login success!
- 05-25 04:52:57.034: E/image size(22501): 2461
- 05-25 04:52:57.094: E/Image exists(22501): size = 2461

画像を保存した後、ファイル サイズが正しくないのはなぜですか? アクセス方法が間違っていますか?補足として、私は Android の初心者であり、コンテキストの使用方法を完全には把握していません。これが私の問題かもしれないのではないかと心配しています。コードでは、Home はこれが呼び出されているアクティビティです。

編集:onPostExecute() @Samarthのリクエストで この行を追加しました

iv.setImageBitmap(result);

ダウンロードした画像を表示するivはどこにありますか。ImageView結果のログはまったく同じでした。誰かがAsyncTask's onPostExecute()メソッドで画像を設定する利点を説明できますか? 私のupdateClanEmblemメソッドを含めるのを忘れたようですので、ここにあります:

/**
 * Method to call DownloadImageTask which downloads then saves the updated clan emblem
 * 
 * @param iv The ImageView to set the emblem to
 * @param url The URL, as a String, to the page containing ONLY the clan emblem.
 * @param newClan The new clan emblem to download.
 * @param prevClan The old clan emblem to delete. Can be null.
 */
public static void updateClanEmb(ImageView iv, String url, String newClan, String prevClan){
    String[] params = {
            url,
            newClan,
            prevClan,
    };

    try {
        new DownloadImageTask(iv).execute(params).get();
    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
}
4

2 に答える 2

0

少し苦労した後、私は自分の解決策を見つけました。AsyncTaskファイルサイズを確認する前に終了していませんでした。.get()この方法では完了するまで待たされるという印象を受けましたが、それは間違いでした。私がこれをすぐに見つけられなかった理由は、私が間違いを犯し、間違ったファイルをチェックしていたAsyncTaskため、誤解を招く情報を得ていたためです.

このことから私が学んだこと: の.get()メソッドはAsyncTask、タスクが終了するのを常に待つわけではありません。メソッドで必要なことは何でも実行してくださいonPostExecute()。そうしないと、期待どおりに機能しません。.get()メソッドが何をするのかはまだわかりません。

于 2013-05-28T06:09:56.327 に答える