2

My activity gets force closed when there is no internet connection.How do I prevent this? I am thinking of showing a message to the user that there is no internet connection if it is not connected.In which all ways should I change the code? Thanks in advance

public class Myclass extends BaseActivity {

private String[] imageUrls;

private DisplayImageOptions options;

private InputStream is;

private String result;

@SuppressLint("NewApi")
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.ac_image_grid);


    imageUrls = new String[1000];

    try{

        HttpClient httpclient = new DefaultHttpClient();

        HttpPost httppost = new HttpPost(D.url+"gal.php");

        List nameValuepairss = new ArrayList(1);
        // adding attributes to List 
        nameValuepairss.add(new BasicNameValuePair("type","gal_living"));

       httppost.setEntity(new UrlEncodedFormEntity(nameValuepairss));
        HttpResponse response = httpclient.execute(httppost); 
        HttpEntity entity = response.getEntity();
        is = entity.getContent();
        Log.e("log_tag", "connection success username");

}catch(Exception e){
        Log.e("log_tag", "Error in http connection "+e.toString());
        Toast.makeText(getApplicationContext(), "fail1", Toast.LENGTH_SHORT).show();

}
//convert response to string
try{
        BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");

        }
        is.close();

        result=sb.toString();
}catch(Exception e){

       Log.e("log_tag", "Error converting result :::"+e.toString());
   // Toast.makeText(getApplicationContext(), "fail1", Toast.LENGTH_SHORT).show();

}
try{


    JSONArray jArray = new JSONArray(result);
    int arrayLength=jArray.length();
    final String url[]=new String[arrayLength];

    for(int i=0;i<arrayLength;i++){
           JSONObject json_data = jArray.getJSONObject(i);



          url[i]=json_data.getString("url");
    }
    List<String> urls = new ArrayList<String>();
    urls.addAll(Arrays.asList(url));
    imageUrls = urls.toArray(new String[0]);

} catch(JSONException e){
    Log.e("log_tag", "Error parsing data:::::again? "+e.toString());
    }   options = new DisplayImageOptions.Builder()
        .showStubImage(R.drawable.stub_image)
        .showImageForEmptyUri(R.drawable.image_for_empty_url)
        .cacheInMemory()
        .cacheOnDisc()
        .build();
    GridView gridView = (GridView) findViewById(R.id.gridview);
    gridView.setAdapter(new ImageAdapter());
    gridView.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            startImageGalleryActivity(position);
        }
    });
}

private void startImageGalleryActivity(int position) {
    Intent intent = new Intent(this, ImagePagerActivity.class);
    intent.putExtra(Extra.IMAGES, imageUrls);
    intent.putExtra(Extra.IMAGE_POSITION, position);
    startActivity(intent);
}

public class ImageAdapter extends BaseAdapter {
    @Override
    public int getCount() {
        return imageUrls.length;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        final ImageView imageView;
        if (convertView == null) {
            imageView = (ImageView) getLayoutInflater().inflate(R.layout.item_grid_image, parent, false);
        } else {
            imageView = (ImageView) convertView;
        }

        imageLoader.displayImage(imageUrls[position], imageView, options, new SimpleImageLoadingListener() {
            @Override
            public void onLoadingComplete(Bitmap loadedImage) {
                Animation anim = AnimationUtils.loadAnimation(LivingGrid.this, R.anim.fade_in);
                imageView.setAnimation(anim);
                anim.start();
            }
        });

        return imageView;
    }}}
ess.crazy
  • 296
  • 1
  • 4
  • 24

3 Answers3

1
  1. Move all the internet-related code into an AsyncTask. If you don't do that, this app will crash immediately on any Android 4.0+ device.
  2. Add liberal error checking -- i.e. if the internet connection failed, don't try to read from it.
  3. Kick off the AsyncTask from the onCreate, and in onPostExecute either update your UI with the results of the fetch, or display a message if it failed.
323go
  • 14,143
  • 6
  • 33
  • 41
1

Use ConnectivityManager

ConnectivityManager connection =  Context.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo currentConnection = connection.getActiveNetworkInfo();


if(currentConnection != null && currentConnection.isConnected())
{
  // You have a network connection
}
else
{
   // No Network connection
}

And don't forget

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

Additional:

You shouldn't do any network operations within main thread or else you will get ANR (Android Not Responding) Dialog. Instead, use AsyncTask and Handler to access Main Thread from Background Thread

0

I think you can just put a return in the first catch clause. Because although you have caught Http Connection exception, the below code would still be executed. At that time, "is" is null, so reading from "is" would cause crash.

try{

    HttpClient httpclient = new DefaultHttpClient();

    HttpPost httppost = new HttpPost(D.url+"gal.php");

    List nameValuepairss = new ArrayList(1);
    // adding attributes to List 
    nameValuepairss.add(new BasicNameValuePair("type","gal_living"));

   httppost.setEntity(new UrlEncodedFormEntity(nameValuepairss));
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
    Log.e("log_tag", "connection success username");

}catch(Exception e){
    Log.e("log_tag", "Error in http connection "+e.toString());
    Toast.makeText(getApplicationContext(), "fail1", Toast.LENGTH_SHORT).show();

    return; // ADD return HERE!!!!!!!!!!!!
}
TieDad
  • 9,143
  • 5
  • 32
  • 58
  • Thank you ..do u mind showing me how that return is to be given in my code? – ess.crazy Nov 28 '12 at 05:45
  • thank you @Evan Li ,your idea worked for me..Even though asynctask is useful, in my case your idea was enough..thank you – ess.crazy Nov 28 '12 at 06:00
  • It's not about whether the `AsyncTask` is "useful" -- it's ESSENTIAL if you want your app to work on devices with newer Android versions. If you keep the network on the UI thread, it WILL crash... ALWAYS. – 323go Nov 28 '12 at 14:50
  • I agree network operation should be in AsyncTask or a separate thread. But, 323go, did you read through code in the question? Did you hit the key point of the question? The code had logic error, without adding the "return", even if put those code in AsyncTask, it would still CRASH! I just directly gave a solution for the logic error, I didn't say anything to refuse AsyncTask, why you voted down my answer???!!! – TieDad Nov 29 '12 at 01:00