Selasa, 17 Juni 2014

Aplikasi Android Menggunakan Thread Background Process untuk Mengambil Data dari Web Server HTTP dengan Progress Dialog

Aplikasi Android Menggunakan Thread Background Process untuk Mengambil Data dari Web Server HTTP dengan Progress DialogAplikasi Android Menggunakan Thread Background Process untuk Mengambil Data dari Web Server HTTP dengan Progress Dialog ini ternyata sudah sangat urgen untuk dikuasai. Karena berbagai aplikasi yang pernah penulis buat di Blog ini seperti Membuat Aplikasi Android Client Server JSON PHP Database MySQL semakin banyak yang mengalami error jika dijalankan di Project Android yang menggunakan Eclipse / SDK Android terbaru. Kenapa? Karena ternyata mulai SDK Android Jelly Beans, semua akses ke Internet, khususnya ke Web (HTTP) Server harus menggunakan Thread, tidak boleh dijalankan secara langsung, mungkin karena hal itu sangat berpotensi membuat program menjadi Hang selama mendownload data dari Web Server. Solusi sederhananya sebenarnya sangat simple, tinggal anda buka AndroidManifest.xml kemudian cari dan hapus baris berikut :


android:targetSdkVersion="16"

Secara ajaib Project kita langsung berjalan dengan normal :D. Tetapi mulai SDK Android Kitkat, hal itu sudah tidak dapat dilakukan lagi :( Terpaksa kita harus belajar sesuatu yang lebih rumit untuk menyelesaikan permasalahan ini, oleh sebab itu coba kita selesaikan dengan Aplikasi Android Menggunakan Thread Background Process untuk Mengambil Data dari Web Server HTTP dengan Progress Dialog ini.

Pertama kita buat Project Android di Eclipse seperti biasa. Kemudian buka MainActivity.java, tambahkan kode program berikut ini :

package com.amijaya.android_background_thread_ansync_task;

import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.app.ProgressDialog;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends Activity {

// http://cariprogram.blogspot.com
// nuramijaya@gmail.com

Button button1;
ProgressDialog pd;
 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
proses();
}
});
}

public void proses() {
Toast.makeText(getBaseContext(),
                "Please wait, connecting to server.",
                Toast.LENGTH_SHORT).show();

        Thread background = new Thread(new Runnable() {
             
            private final HttpClient Client = new DefaultHttpClient();
            private String URL = "http://contohprogram.com/demo/index.php";
             
            // program yang dijalankan ketika thread background berjalan
            public void run() {
            String SetServerString = "";
                try {

                    HttpGet httpget = new HttpGet(URL);
                    ResponseHandler<String> responseHandler = new BasicResponseHandler();
                    SetServerString = Client.execute(httpget, responseHandler);
                } catch (Throwable t) {
                    // jika error
                    Log.i("Failed", "Thread  exception " + t);
                }
                //mengirim pesan pada handler ketika 
                //threadMsg(SetServerString);
                Message msgObj = handler.obtainMessage();
                Bundle b = new Bundle();
                b.putString("message", SetServerString);
                msgObj.setData(b);
                handler.sendMessage(msgObj);
            }
            /*
            private void threadMsg(String msg) {

                if (!msg.equals(null) && !msg.equals("")) {
                    Message msgObj = handler.obtainMessage();
                    Bundle b = new Bundle();
                    b.putString("message", msg);
                    msgObj.setData(b);
                    handler.sendMessage(msgObj);
                }
            }
*/
            // membuat Handler untuk menerima pesan ketika selesai
            private final Handler handler = new Handler() {
                public void handleMessage(Message msg) {
                    String aResponse = msg.getData().getString("message");
                    if ((null != aResponse) && (aResponse != "")) {
                        // ALERT MESSAGE
                        Toast.makeText(
                                getBaseContext(),
                                "Response Server : "+aResponse,
                                Toast.LENGTH_SHORT).show();
                    }
                    else
                    {
                            // ALERT MESSAGE
                            Toast.makeText(
                                    getBaseContext(),
                                    "Tidak Bisa Mendapatkan Data dari Server.",
                                    Toast.LENGTH_SHORT).show();
                    }    
                    pd.dismiss();
                    button1.setEnabled(true);
                }
            };

        });
        // Start Thread
        pd = ProgressDialog.show(MainActivity.this, "Please Wait", "Downloading..", true);
button1.setEnabled(false);

        background.start();  //memanggil thread background agar start
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.activity_main, menu);
return true;
}

}

Untuk tampilan, buat desain tampilan berikut ini pada activity_main.xml, tambahkan satu buah Button, susunlah menjadi seperti di bawah ini :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Get Data From Server" />

</LinearLayout>

Pada Konfigurasi AndroidManifest.xml jangan lupa tambahkan permission INTERNET. Sedangkan targetSdkVersion tidak perlu dihapus karena kita sudah menggunakan Thread Background. Seperti ini :

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

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />
    <uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.amijaya.android_background_thread_ansync_task.MainActivity"
            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>

</manifest>

Setelah dijalankan hasilnya seperti ini :

Aplikasi Android Menggunakan Thread Background Process untuk Mengambil Data dari Web Server HTTP dengan Progress Dialog


Kemudian jika diklik Tombol Get Server Data maka akan muncul ProgressDialog Loading Please Wait, dan Tombol jadi sementara tidak bisa diklik.

Aplikasi Android Menggunakan Thread Background Process untuk Mengambil Data dari Web Server HTTP dengan Progress Dialog

Setelah berhasil mengambil data dari Server Web (HTTP) hasilnya akan ditampilkan, Progress Dialog akan menghilang dan tombol "Get Server Data" juga bisa diklik lagi. Seperti di bawah ini :

Aplikasi Android Menggunakan Thread Background Process untuk Mengambil Data dari Web Server HTTP dengan Progress Dialog

Apabila gagal mendapatkan informasi dari Web Server maka akan muncul Peringatan, kemudian ProgressDialog Please Wait juga menghilang, tombol bisa diklik lagi.

Aplikasi Android Menggunakan Thread Background Process untuk Mengambil Data dari Web Server HTTP dengan Progress Dialog

Project selengkapnya dapat anda download disini. Jika bingung cara download, silakan lihat caranya disini.

Semoga bermanfaat ^_^

Tidak ada komentar:

Posting Komentar