2011-06-02 6 views
0

私はプログラミングに慣れているので、これは私にとって大きな学習体験であり、これまで多くの楽しみがあった。AsyncTaskで画像をダウンロードする、ネットワークに接続していない場合は助けが必要

私がやろうとしているのは、アプリに画像を読み込んで、変更して定期的にサーバーにアップロードすることです。今すぐ、適切なイメージがバックグラウンドでダウンロードされるまでプレースメントイメージをロードし、ダウンロードされた新しいイメージを表示します。

私の問題は、ネットワークに接続されていないと、何も表示されないということです。私はPostExecuteで、ネットから画像を読み込めなかった場合にアプリケーションからdrawableを表示することができると仮定しています。私はそれを行う方法がわかりません!

ご協力いただければ幸いです!

編集:代替画像を表示するのに正しい軌道にいるのですか?

import java.io.IOException; 
import java.lang.ref.WeakReference; 
import java.net.MalformedURLException; 
import java.net.URL; 

import android.content.Context; 
import android.content.res.Resources; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.os.AsyncTask; 
import android.widget.ImageView; 
import android.widget.Toast; 

public class ImageDownloader extends AsyncTask<String, Void, Bitmap> { 

private String url; 
private final WeakReference<ImageView> imageViewReference; 
private Resources res; 

public ImageDownloader(ImageView imageView) { 
    imageViewReference = new WeakReference<ImageView>(imageView); 
} 


@Override 
protected Bitmap doInBackground(String... params) { 
    url = params[0];   
    try { 
     return BitmapFactory.decodeStream(new URL(url).openConnection() 
       .getInputStream()); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
     return null; 
    } catch (IOException e) { 


     return BitmapFactory.decodeResource(res, R.drawable.displayThis); 

     } 
} 


@Override 
protected void onPostExecute(Bitmap result) { 
    if (isCancelled()) { 
     result = null; 
    } 
    if (imageViewReference != null) { 
     ImageView imageView = imageViewReference.get(); 
     if (imageView != null) { 
      imageView.setImageBitmap(result); 
     } 
    } 
} 

@Override 
protected void onPreExecute() { 
    if (imageViewReference != null) { 
     ImageView imageView = imageViewReference.get(); 
     if (imageView != null) { 
      imageView.setImageResource(R.drawable.uboxback); 
     } 
    } 
} 
} 
+0

私はあなたがネットワークの問題の場合には、 'IOException'を取得し、そのonPostExecute''に 'null'なのでを渡していると信じて....それがお役に立てば幸いです。ヌルをチェックし、 "エラー"ビットマップを表示することができます。 –

答えて

0

戻り値としてnullを取得した場合、doInBackground関数を使用すると、別のイメージを表示できませんか? また、それを実行しようとする前に利用可能なネットワーク接続があるかどうかを常に確認して、その時点で何かを行うことができますか?

ネットワーク接続は次のような何かをすることによって、利用可能かどうかをチェックすることができます:

ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE); 
     NetworkInfo netInfo = cm.getActiveNetworkInfo(); 
     if (netInfo != null && netInfo.isConnected()) { 
//this is connected 
    } 

は、このすべての助けをしていますか?

インターネットの場合はBexの

0

は)doInBackground(インターネットから取得したデータ中に失敗し、例外がcatchブロックに来ます。ここであなたはトリックをすることができます。

グローバル変数を1つ取ります。インターネットが失敗した場合は、キャッチブロック内のその変数に「失敗」値を割り当てます。その後、onPostExecute()でifの助けを借りてチェックすることができ、elseはこの変数に依存します。

関連する問題