Basim Sherif Basim Sherif - 5 months ago 26
Android Question

Check internet connection in Android and reload the activity if it is not available

I have develped an Android RSS reader.I have created a tab layout and created each tab for each type of news(say Headlines,National,International etc).

Then I listed RSS title and its images in custom listview on the first page of tablayout.
see the image below.

enter image description here

Now when the user click on a news title, another activity(page) opens with the news description.

My problem is when a user clicks on a tab and when it loads, if the internet connection is not available I want to show a dialog box with two buttons, Retry & Exit.

When the user click Retry the activity should be reloaded.I used a method( if(International.Title==null) ).But I dont think its a right method to do this.I want to know if there is a better solution for checking whether the network is available....

Here is my code,

public class International extends Activity {
static final String URL = "http://www.abcd.com/en/taxonomy/term/3/0/feed";
static final String KEY_HEAD = "item";
static final String KEY_DATE = "pubDate";
ListView list;
InternationalAdapter adapter;

public static String[] Title;
public static String[] Description;
public static String[] image;
public static String[] Date;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.headlines);

Bundle mybundle = new Bundle();
mybundle.putString("number", "0");
new DoInBackground().execute();
}
public void do_update()
{
internationalparser.parse();//this is the function to parse RSS feeds

}


public void populate_listview()
{

ArrayList<HashMap<String, String>> newsList = new ArrayList<HashMap<String, String>>();

XMLParser parser = new XMLParser();
String xml = parser.getXmlFromUrl(URL); // getting XML from URL
Document doc = parser.getDomElement(xml); // getting DOM element

NodeList nl = doc.getElementsByTagName(KEY_HEAD);
// looping through all song nodes <song>
NodeList itemLst = doc.getElementsByTagName("item");


for (int i = 0; i < nl.getLength(); i++) {
// creating new HashMap
HashMap<String, String> map = new HashMap<String, String>();
Element e = (Element) nl.item(i);

//map.put(KEY_DATE, parser.getValue(e, KEY_DATE));

newsList.add(map);
}


list=(ListView)findViewById(R.id.list);

// Getting adapter by passing xml data ArrayList
adapter=new InternationalAdapter(this, newsList);
list.setAdapter(adapter);


// Click event for single list row
list.setOnItemClickListener(new OnItemClickListener() {


public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
Intent myintent = new Intent("com.abcd.rssreaderinternationalpodcast.PODCAST");
Bundle mybundle = new Bundle();
mybundle.putInt("number", position);
myintent.putExtras(mybundle);

startActivity(myintent);

}

});

}


private class DoInBackground extends AsyncTask<Void, Void, Void>
implements DialogInterface.OnCancelListener
{
private ProgressDialog dialog;
private Intent intent;
private Intent intent2;

public void onPreExecute()
{

dialog = ProgressDialog.show(International.this, "", "Loading", true);

}

protected Void doInBackground(Void... unused)
{


do_update();
return null;
}

public void retry()
{

internationalparser.parse();
}

protected void onPostExecute(Void unused)
{


if(International.Title!=null)
{

dialog.dismiss();
populate_listview();

}
if(International.Title==null) ///this is what I tried.
{
dialog.dismiss();
AlertDialog.Builder alertbox = new AlertDialog.Builder(International.this);

alertbox.setMessage("Error in connection!");
alertbox.setPositiveButton("Retry", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface arg0, int arg1) {

retry(); //here i want to reload activity

}

});

alertbox.setNegativeButton("Exit", new DialogInterface.OnClickListener() {


public void onClick(DialogInterface arg0, int arg1) {

finish();

}

});

alertbox.show();

}

}

public void onCancel(DialogInterface dialog)
{
cancel(true);
dialog.dismiss();
}
}
}

Answer

This is my class for internet connection with retry/exit

usage:

URLContent httpContent = new URLContent(this);
String test =  httpContent.getContent("http://www.hotmail.com/");

class:

import java.io.BufferedReader;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URI;


import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;

public class URLContent {

    MainActivity mMainActivity;
    String returnData;
    String address;

    public URLContent(MainActivity mMainActivity)  
    {
        this.mMainActivity = mMainActivity;
    }


    public String getContent(String address)
    {
        this.address = address;
        processContent(address);
        return returnData;
    }

    private void processContent(String address)
    {

        try {

            if (!isNetworkAvailable(mMainActivity))
            {
                throw new Exception("No internet connectivity.");
            }

            HttpClient client = new DefaultHttpClient();
            HttpGet request = new HttpGet();
            request.setURI(new URI(address));
            HttpResponse response = client.execute(request);

                if (response.getStatusLine().getStatusCode() == 200)
                {
                    InputStream ips  = response.getEntity().getContent();
                    BufferedReader buf = new BufferedReader(new InputStreamReader(ips,"UTF-8"));

                    StringBuilder sb = new StringBuilder();
                    String s;
                    while(true)
                    {
                        s = buf.readLine();
                        if(s==null || s.length()==0)
                            break;
                        sb.append(s);

                    }
                    buf.close();
                    ips.close();

                    returnData = sb.toString();
                }
                else
                {
                    throw new Exception();
                }

        } catch (Exception e) {

             makeAndShowDialogBox(e.getMessage()).show();
        }

    }

    private static boolean isNetworkAvailable(Context context) 
    {
       ConnectivityManager connectivity = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
       if (connectivity == null) 
       {
           return false;
       } else 
       {
          NetworkInfo[] info = connectivity.getAllNetworkInfo();
          if (info != null) 
          {
             for (int i = 0; i < info.length; i++) 
             {
                if (info[i].getState() == NetworkInfo.State.CONNECTED) 
                {
                   return true;
                }
             }
          }
       }
       return false;
    }

    private AlertDialog makeAndShowDialogBox(String msg)
    {
        AlertDialog myQuittingDialogBox =  new AlertDialog.Builder(mMainActivity) 

            .setCancelable(false)
            .setTitle(R.string.connectionerr) 
            .setMessage(msg) 

            .setPositiveButton("Retry", new DialogInterface.OnClickListener() { 
                public void onClick(DialogInterface dialog, int whichButton) { 
                 //whatever should be done when answering "YES" goes here
                    getContent(address);
                }              
            })//setPositiveButton
            .setNegativeButton("Exit", new DialogInterface.OnClickListener() { 
                public void onClick(DialogInterface dialog, int whichButton) { 
                 //whatever should be done when answering "NO" goes here
                    mMainActivity.finish();
             } 
            })//setNegativeButton

            .create();

            return myQuittingDialogBox;
    }

}