我是编程的新手所以请耐心等待,这对我来说是一次很大的学习经历,到目前为止它已经很有趣了。
我要做的是将图片加载到我更改的应用中并定期上传到我的服务器。现在,它会加载展示位置图片,直到在背景中完成正确的图片下载,然后显示已下载的新图片。
我的问题是,如果没有网络连接,它最终根本没有显示任何内容。我假设我可以在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 :(得分:0)
如果你从doInBackground函数得到null作为返回值,你不能只显示另一个图像吗? 您还可以在尝试执行任何网络连接之前检查是否有可用的网络连接并在此时执行某些操作吗?
您可以通过执行类似以下操作来检查网络连接是否可用:
ConnectivityManager cm = (ConnectivityManager) ctx.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo netInfo = cm.getActiveNetworkInfo();
if (netInfo != null && netInfo.isConnected()) {
//this is connected
}
这有帮助吗?
贝克斯
答案 1 :(得分:0)
如果在doInBackground()中从互联网获取数据时互联网失败,则会在catch块中出现异常。在这里,你可以做到这一点。
取一个全局变量。如果互联网失败,则将“失败”值分配给catch块中的该变量。然后在onPostExecute()中你可以检查if和else的帮助取决于这个变量。
希望它有所帮助......