Android帮助停止活动崩溃(FC)时,没有互联网连接存在



我已经按照教程远程下载图像,它工作得很好,当一个互联网连接存在,但当你启动活动没有互联网连接存在的活动崩溃"强制关闭"

不幸的是,我是一个android新手,所以我不知道该怎么做才能阻止它崩溃。这是不是一种方法,就是在空白屏幕上留言说"对不起,需要上网",没有什么花哨的,只是为了防止它崩溃。

希望有人能告诉我如何做到这一点,谢谢露西

private ImageAdapter imageAdapter;
private ArrayList<String> PhotoURLS = new ArrayList<String>();
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
      this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN ,
            WindowManager.LayoutParams.FLAG_FULLSCREEN );
    setContentView(R.layout.galleryview);
    public static boolean isDataConnectionAvailable(Context context){
        ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = connectivityManager.getActiveNetworkInfo();
        if(info == null)
            return false;
        return connectivityManager.getActiveNetworkInfo().isConnected();
    }
    imageAdapter = new ImageAdapter(this);
    final ImageView imgView = (ImageView) findViewById(R.id.GalleryView);
    Gallery g = (Gallery) findViewById(R.id.Gallery);
    g.setAdapter(imageAdapter);
    g.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View v,
                int position, long id) {
            imgView.setImageDrawable(LoadImageFromURL(PhotoURLS
                    .get(position)));
            imgView.setScaleType(ImageView.ScaleType.FIT_XY);
        }
    });
    // replace this code to set your image urls in list
    PhotoURLS.add("http://domain.com/image-286.jpg"); 
    PhotoURLS.add("http://domain.com/image-285.jpg"); 
    PhotoURLS.add("http://domain.com/image-284.jpg"); 
    PhotoURLS.add("http://domain.com/image-283.jpg"); 
    PhotoURLS.add("http://domain.com/image-282.jpg"); 
    PhotoURLS.add("http://domain.com/image-281.jpg"); 

    new AddImageTask().execute();
}
class AddImageTask extends AsyncTask<Void, Void, Void> {
    @Override
    protected Void doInBackground(Void... unused) {
        for (String url : PhotoURLS) {
            String filename = url.substring(url.lastIndexOf("/") + 1,
                    url.length());
            filename = "th_" + filename;
            String thumburl = url.substring(0, url.lastIndexOf("/") + 1);
            imageAdapter.addItem(LoadThumbnailFromURL(thumburl + filename));
            publishProgress();
            //SystemClock.sleep(200);
        }
        return (null);
    }
    @Override
    protected void onProgressUpdate(Void... unused) {
        imageAdapter.notifyDataSetChanged();
    }
    @Override
    protected void onPostExecute(Void unused) {
    }
}
private Drawable LoadThumbnailFromURL(String url) {
    try {
        URLConnection connection = new URL(url).openConnection();
        String contentType = connection.getHeaderField("Content-Type");
        boolean isImage = contentType.startsWith("image/");
        if(isImage){
            HttpGet httpRequest = new HttpGet(url);
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = (HttpResponse) httpclient
                    .execute(httpRequest);
            HttpEntity entity = response.getEntity();
            BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(entity);
            InputStream is = bufferedHttpEntity.getContent();
            Drawable d = Drawable.createFromStream(is, "src Name");
            return d;
        } else {
            Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.no_image);
            Drawable d = new BitmapDrawable(b);
            return d;
        }
    } catch (Exception e) {
        Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG)
                .show();
        Log.e(e.getClass().getName(), e.getMessage(), e);
        return null;
    }
}
private Drawable LoadImageFromURL(String url) {
    try {
        URLConnection connection = new URL(url).openConnection();
        String contentType = connection.getHeaderField("Content-Type");
        boolean isImage = contentType.startsWith("image/");
        if(isImage){
            HttpGet httpRequest = new HttpGet(url);
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = (HttpResponse) httpclient
                    .execute(httpRequest);
            HttpEntity entity = response.getEntity();
            BufferedHttpEntity bufferedHttpEntity = new BufferedHttpEntity(
                    entity);
            InputStream is = bufferedHttpEntity.getContent();
            // Decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(is, null, o);
            // The new size we want to scale to
            final int REQUIRED_SIZE = 320;
            // Find the correct scale value. It should be the power of 2.
            int width_tmp = o.outWidth, height_tmp = o.outHeight;
            int scale = 1;
            while (true) {
                if (width_tmp / 2 < REQUIRED_SIZE
                        || height_tmp / 2 < REQUIRED_SIZE)
                    break;
                width_tmp /= 2;
                height_tmp /= 2;
                scale *= 2;
            }
            // Decode with inSampleSize
            is = bufferedHttpEntity.getContent();
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            Bitmap b = BitmapFactory.decodeStream(is, null, o2);
            Drawable d = new BitmapDrawable(b);
            return d;
        } else {
            Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.no_image);
            Drawable d = new BitmapDrawable(b);
            return d;
        }
    } catch (Exception e) {
        Toast.makeText(getApplicationContext(), "error", Toast.LENGTH_LONG)
                .show();
        Log.e(e.getClass().getName(), e.getMessage(), e);
        return null;
    }
}
public class ImageAdapter extends BaseAdapter {
    int mGalleryItemBackground;
    private Context mContext;
    ArrayList<Drawable> drawablesFromUrl = new ArrayList<Drawable>();
    public ImageAdapter(Context c) {
        mContext = c;
        TypedArray a = obtainStyledAttributes(R.styleable.GalleryTheme);
        mGalleryItemBackground = a.getResourceId(
        R.styleable.GalleryTheme_android_galleryItemBackground, 0);
        a.recycle();
    }
    public void addItem(Drawable item) {
        drawablesFromUrl.add(item);
    }
    public int getCount() {
        return drawablesFromUrl.size();
    }
    public Drawable getItem(int position) {
        return drawablesFromUrl.get(position);
    }
    public long getItemId(int position) {
        return position;
    }
    public View getView(int position, View convertView, ViewGroup parent) {
        ImageView i = new ImageView(mContext);
        i.setImageDrawable(drawablesFromUrl.get(position));
        i.setLayoutParams(new Gallery.LayoutParams(70, 110));
        i.setScaleType(ImageView.ScaleType.FIT_CENTER);
        //i.setBackgroundResource(mGalleryItemBackground);
        return i;

    }

}
}

您可以查看连接是否可用:

public static boolean isDataConnectionAvailable(Context context){
        ConnectivityManager connectivityManager = (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo info = connectivityManager.getActiveNetworkInfo();
        if(info == null)
            return false;
        return connectivityManager.getActiveNetworkInfo().isConnected();
    }

注意:添加权限到您的manifest文件:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

我可以确认Vineet的答案是好的,因为我也有同样的问题。

不能正常工作的代码如下:

public boolean isOnline() {
final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);        
final NetworkInfo networkInfo = cm.getActiveNetworkInfo();      
boolean connected = networkInfo.isConnected();
    if (connected)
        return true;
    else
        return false;

}

上面示例的问题是networkInfo.isConnected()似乎没有值。我将布尔值设置为null,我认为这是不允许的(是的,我的Java是粗略的,因为我是一个新手),因此应用程序会抛出一个异常并崩溃。

现在我用Vineet的解决方案解决了这个问题。

public boolean isOnline() {
final ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);        
final NetworkInfo networkInfo = cm.getActiveNetworkInfo();      
if(networkInfo == null)
    return false;
else
    return networkInfo.isConnected();

}

现在,它正常工作,应用程序不再崩溃。希望这个解决方案能帮助到一些人。我想JAVA专家会更好地解释为什么不允许将boolean设置为Null。

最新更新