2011-06-02 85 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'等通過'null'到'onPostExecute'。你可以檢查null並顯示「錯誤」位圖然後.. – 2011-06-02 13:34:25

回答

0

如果你得到null作爲你的返回值doInBackground函數可以不只顯示另一個圖像嗎? 你也可以在嘗試做任何事情之前檢查是否有可用的網絡連接,並在那時做點什麼?

您可以檢查網絡連接可用做類似如下的內容:

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

這是否幫助呢?

貝克斯

0

在互聯網的情況下在數據doInBackground從互聯網上獲得(),異常會進來catch塊失敗。在這裏你可以做到這一點。

取一個全局變量。如果互聯網失敗,則將「失敗」值分配給catch塊中的變量。然後在onPostExecute()你可以檢查與if和else的幫助取決於這個變量。

希望它可以幫助....