Tutorial Android : Mengecek Ada Tidaknya Koneksi Internet Pada Aplikasi Android

Hari ini saya jalan-jalan lagi bersama si Paijo, sekalian latihan buat si doi supaya gak sempoyongan ketika saya berangkat ke selat pasih minggu depan. Keliling mencari warnet, untuk mengetes penanggulangan dari force close aplikasi android yang saya coba tadi malam ketika gagal untuk mengakses internet. Di postingan kemarin, saya sudah membahas cara penggunaan AsyncTask untuk penanggulangan force close ketika aplikasi yang kita buat berjalan di android versi 3.0 ke atas saat mengakses internet. Saya coba untuk tes langsung di hape Galaxy Gio, ternyata force close ketika tidak adanya koneksi internet. Pengennya sih tidak langsung force close, tetapi ada semacam peringatan menggunakan dialog box maupun Toast yang menyampaikan pada pengguna bahwa tidak adanya koneksi internet yang bisa dipakai. Setelah membaca dokumentasinya di developer.android.com, ketemulah caranya yaitu dengan menggunakan ConnectivityManager

ConnectivityManager ini saya tempatkan pada sebuah method yang bertipekan boolean, menghasilkan nilai true dan false. Method tersebut dipanggil di method onCreate(), jika bernilai true langsung di arahkan ke proses selanjutnya dan jika bernilai false muncul sebuah dialog box yang menginformasikan bahwa tidak tersedianya koneksi internet. Nah, pada studi kasus kali ini saya menggunakan contoh yang kemarin, tentang penggunaan AsyncTask.  Jadinya saya hanya akan menambahkan dan mengubah sedikit kode pada main activity dan menambahkan permision pada AndroidManifest.xml untuk memperbolehkan aplikasi untuk mengakses ACCESS_NETWORK_STATE.

1. Untuk lebih mudahnya, boleh menggunakan contoh AsyncTask yang kemarin. Tapi disini saya akan memakai project android yang baru agar lebih fresh.

2. Kita membutuhkan 2 buah layout, yaitu main.xml dan list_row.xml. Buka dan edit kedua file layout tersebut dengan kode layout di bawah ini :

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <ListView
        android:id="@android:id/list"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>

list_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
    	android:layout_margin="10dp"
        android:orientation="vertical">

        <TextView
            android:id="@+id/judul"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:textColor="#fff"
            android:textSize="14sp"
            android:textStyle="bold"
            android:paddingBottom="2dip" />

        <TextView
            android:id="@+id/tanggal"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:textColor="#fff"
            android:textSize="10sp" />
    </LinearLayout>

</LinearLayout>

3. Sekarang buka file TesKoneksiDataActivity.java, ketikkan kode di bawah ini. Disini saya menambahkan sebuah method cek_status() yang didalamnya memanggil info dari ConnectivityManager untuk mendapatkan info ada atau tidaknya koneksi internet. Kemudian method cek_status() dipanggil di method onCreate melalui sebuah selection. Jika trus, maka data dapat diambil dari server dan jika salah maka muncul sebuah dialog box yang telah kita buat di bawahnya.

public class TesKoneksiDataActivity extends ListActivity {

	static String in_judul = "judul";
	static String in_waktu = "tanggal";
	JSONArray str_json = null;
	public String lo_Koneksi,isi ;

	private ProgressDialog pDialog;
	ArrayList<HashMap<String, String>> data_map = new ArrayList<HashMap<String, String>>();
	static final int tampil_error=1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
		if (cek_status(this))
		{
	        Koneksi lo_Koneksi = new Koneksi();
	        isi = lo_Koneksi.isi_koneksi();
	        new AmbilData().execute();
		}
		else
		{
			showDialog(tampil_error);
		}
    }

    public boolean cek_status(Context cek) {
    	ConnectivityManager cm = (ConnectivityManager) cek.getSystemService(Context.CONNECTIVITY_SERVICE);
    	NetworkInfo info = cm.getActiveNetworkInfo();

		if (info != null && info.isConnected())
		{
			return true;
		}
		else
		{
			return false;
		}
	}

	@Override
	protected Dialog onCreateDialog(int id) {
		Dialog dialog = null;
		switch (id) {
		case tampil_error:
			AlertDialog.Builder errorDialog = new AlertDialog.Builder(this);
			errorDialog.setTitle("Koneksi Error");
			errorDialog.setMessage("Koneksi internet ente memprihatinkan gan...!!!");
			errorDialog.setNeutralButton("#OKOK",
					new DialogInterface.OnClickListener() {

						@Override
						public void onClick(DialogInterface dialog, int id) {
							dialog.dismiss();
							Intent exit = new Intent(Intent.ACTION_MAIN);
							exit.addCategory(Intent.CATEGORY_HOME);
							exit.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
							TesKoneksiDataActivity.this.finish();
							startActivity(exit);
						}
					});

			AlertDialog errorAlert = errorDialog.create();
			return errorAlert;

		default:
			break;
		}
		return dialog;
	}

    class AmbilData extends AsyncTask<String, String, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(TesKoneksiDataActivity.this);
            pDialog.setMessage("Sabar gan, masih ngambil data neh...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(true);
            pDialog.show();
        }

        protected String doInBackground(String... args) {

            String link_url = isi+"berita.php";
    		JSONParser jParser = new JSONParser();
    		JSONObject json = jParser.AmbilJson(link_url);

    		try {
    			str_json = json.getJSONArray("berita");

    			for(int i = 0; i < str_json.length(); i++){
    				JSONObject ar = str_json.getJSONObject(i);

    				HashMap<String, String> map = new HashMap<String, String>();

    				String judul = ar.getString("judul");
    				String waktu = ar.getString("tanggal")+" | "+ar.getString("waktu");

    				map.put(in_judul, judul);
    				map.put(in_waktu, waktu);

    				data_map.add(map);
    			}
    		} catch (JSONException e) {
    			e.printStackTrace();
    		}
            return null;
        }

        protected void onPostExecute(String file_url) {
            pDialog.dismiss();
            runOnUiThread(new Runnable() {
                public void run() {
                	ListAdapter adapter = new SimpleAdapter(
							TesKoneksiDataActivity.this, data_map,
							R.layout.list_row, new String[] { in_judul, in_waktu}, new int[] {R.id.judul, R.id.tanggal});
                    setListAdapter(adapter);
                }
            });

        }
    }
}

4. Jangan lupa untuk menambahkan 2 permision pada Android, yaitu untuk mengakses internet dan mengakses info network state.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="dlmbg.pckg.tes.koneksi"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name=".TesKoneksiDataActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
    <uses-permission android:name="android.permission.INTERNET" />
	<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

</manifest>

5. Untuk uji cobanya tidak bisa dilakukan via emulator, karena hasilnya tidak akan terlihat. Silahkan coba di hape android punya sendiri atau pinjam punya teman dulu :p. Hasilnya seperti di bawah ini, ketika saya coba matikan koneksi internetnya makan muncul dialog box. Dan jika berhasil, maka akan muncul data-data yang tersimpan di dalam server ke dalam sebuah listview.

Sampai disini, bekal kita untuk membuat aplikasi android yang terhubung dengan internet sudah lumayan cukup. Mudah-mudahan di postingan selanjutnya saya bisa posting tentang aplikasi CRUD data sederhana yang mengakses HTTPRequest. OK deh, sekian dulu postingan saya sore ini. Semoga bisa bermanfaat untuk kita semua. Astungkara.

Happy Blogging and Keep Coding

Cheerrrss….!!!!

[to_like][/to_like]

5 comments

  1. Surya Reply

    Wah, ini ya triknya gan..
    Mantapp…
    Makasih udah di share.. 😀

  2. dadan Reply

    bang kalo koneksi internetnya ilang ditengah proses ngambil data gimana cara ngehandlenya biar gak force close

  3. Amir Hamzah Reply

    mau nanya nih gan, klo kita bikin sebuah aplikasi yg kompleks, misalkan sistem informasi akademik kampus, apakah class asynctask tersebut selalu ditambahkan disetiap class untuk activity tertentu atau cukup di main activity aja gan? , mohon pencerahannya