Android unfortunately app has stopped Saat tidak menerima response JSON

Belum lama ini saya melakukan uji coba dengan kondisi abnormal. Dimana aplikasi mengirimkan message dalam bentuk JSON dan host application saya tidak menjawabnya.

Dari hasil uji coba selalu terjadi pesan error "Unfortunately, App has stopped"


Berikut potongan source code:
try{
   if (json.getString(SUCCESS) != null) {
     String res = json.getString(SUCCESS);

     if(Integer.parseInt(res) == 100){                     
  // Do something      
     } else{       
  // Do something
     }

   } else {
     // jika msg didapatkan null atau tidak mendapatkan respon dari host
     Toast.makeText(getBaseContext(), "Tidak mendapatkan respon dari server ", Toast.LENGTH_LONG).show();                    
   }

} catch (JSONException e){
   e.printStackTrace();    
}
Dapat dilihat pada potongan source code diatas jika saya tidak mendapatkan respon maka yang tampil adalah tulisan dari toast "Tidak mendapatkan respon dari server".

Namun pada implementasinya pesan toast tersebut tidak tampil dan ternyata menampilkan pesan error "Unfortunately, App has stopped" disertai force close pada aplikasi.

Isi logcat :

11-22 18:13:14.221: D/AndroidRuntime(556): Shutting down VM
11-22 18:13:14.221: W/dalvikvm(556): threadid=1: thread exiting with uncaught exception (group=0x409951f8)
11-22 18:13:14.251: E/AndroidRuntime(556): FATAL EXCEPTION: main
11-22 18:13:14.251: E/AndroidRuntime(556): java.lang.RuntimeException: Unable to start activity ComponentInfo{org.riz.testJson/org.riz.testJson.TestJSONActivity}: android.os.NetworkOnMainThreadException
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1955)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.ActivityThread.access$600(ActivityThread.java:122)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1146)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.os.Handler.dispatchMessage(Handler.java:99)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.os.Looper.loop(Looper.java:137)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.ActivityThread.main(ActivityThread.java:4340)
11-22 18:13:14.251: E/AndroidRuntime(556):  at java.lang.reflect.Method.invokeNative(Native Method)
11-22 18:13:14.251: E/AndroidRuntime(556):  at java.lang.reflect.Method.invoke(Method.java:511)
11-22 18:13:14.251: E/AndroidRuntime(556):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
11-22 18:13:14.251: E/AndroidRuntime(556):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
11-22 18:13:14.251: E/AndroidRuntime(556):  at dalvik.system.NativeStart.main(Native Method)
11-22 18:13:14.251: E/AndroidRuntime(556): Caused by: android.os.NetworkOnMainThreadException
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1084)
11-22 18:13:14.251: E/AndroidRuntime(556):  at java.net.InetAddress.lookupHostByName(InetAddress.java:391)
11-22 18:13:14.251: E/AndroidRuntime(556):  at java.net.InetAddress.getAllByNameImpl(InetAddress.java:242)
11-22 18:13:14.251: E/AndroidRuntime(556):  at java.net.InetAddress.getAllByName(InetAddress.java:220)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:137)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:164)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:119)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:360)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:555)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:487)
11-22 18:13:14.251: E/AndroidRuntime(556):  at org.riz.testJson.TestJSONActivity.onCreate(TestJSONActivity.java:41)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.Activity.performCreate(Activity.java:4465)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049)
11-22 18:13:14.251: E/AndroidRuntime(556):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919)
11-22 18:13:14.251: E/AndroidRuntime(556):  ... 11 more
11-22 18:13:48.321: I/Process(556): Sending signal. PID: 556 SIG: 9
11-22 18:14:01.552: D/AndroidRuntime(597): Shutting down VM
Pada logcat mendapatkan error
FATAL EXCEPTION: main 

Saya telusuri lebih jauh penyebabnya ada di
android.os.NetworkOnMainThreadException

Maka saya cek pada AndroidManifest dan INTERNET PERMISSION sudah saya tambahkan. Lalu apa penyebabnya?

Setelah dipelajari, ternyata ada yang tidak tepat dari penggunaan JSON (dalam hal ini menggunakan protokol network) di Activity yang saya gunakan.

Masalah tersebut terjadi di karenakan saya melakukan panggilan network di main (event) thread agar tidak terjadi seperti itu, penggunaan network jangan ditempatkan pada main thread melainkan meletakkan di thread yang berbeda.

Untuk itu kita dapat membuat thread terpisah menggunakan AsyncTask atau Standard Thread.

Contoh Standard Thread:
final Handler handler = new Handler();
new Thread(new Runnable() {

     @Override
     public void run() {
          // Do something long running
          handler.post(new Runnable() {

               @Override
               public void run() {
                    // Do something on the UI Thread
               }
          });
     }
}).start();
Contoh AsyncTask:
public class YourTask extends AsyncTask{

    private Context context;
    private ProgressDialog dialog;

    public SplitCueTask(Context context) {
        this.context = context;
        this.dialog = new ProgressDialog(context);           
    }

    @Override
    protected void onPreExecute() {
        dialog.setMessage(getResources().getString(R.string.loading));
        dialog.show();

    }

    @Override
    protected Boolean doInBackground(Object... objects) {
        // you logic here, return result
        return someObject.
    }


    @Override
    protected void onPostExecute(Object someObject) {
        if (dialog.isShowing())
             dialog.dismiss()
        // handle result here, post it on UI or something else
    }
}
Dari aplikasi yang saya buat, saya menggunakan AsyncTask untuk memperbaiki error tersebut. Dan masalah "Unfortunately, App has stopped" jika tidak mendapatkan respon dari host server telah terselesaikan.

Penggunaan lebih lanjut dari AsyncTask akan saya bahas di tulisan berikutnya :)
Android unfortunately app has stopped Saat tidak menerima response JSON Android unfortunately app has stopped Saat tidak menerima response JSON Reviewed by rizupz on Kamis, Januari 24, 2013 Rating: 5

9 komentar:

arus mengatakan...

trus cara ngatasi masalah seperti ini gmana gan??HH ane juga gitu

rizupz mengatakan...

Agan masalahnya dimana?
Kalau saya dikarenakan UI thread dan proses networknya disatukan sehingga dipisahkan dengan membuat Async.

Rully bae mengatakan...

iya gan ..mengatasinya gimana....bnyak game di HH saya yang begitu.....mohon solusinya gan [[[email protected]]]

Unknown mengatakan...

gan klo yg ini masalahnya kenapa ya ?
01-28 04:17:10.302: E/AndroidRuntime(276): FATAL EXCEPTION: main

01-28 04:17:10.302: E/AndroidRuntime(276): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.kalkulator/com.example.kalkulator.MainActivity}: java.lang.ClassCastException: com.example.kalkulator.MainActivity

Unknown mengatakan...

Kalau masalahnya di aplikasi seperti path keluar tulisan "unfortunately, path has stopped" itu bagaimana cara mengatasinya ya?
Terimkasih sebelumnya..

Wiwit Kurniawan mengatakan...

makasih
buatnya
infonya

Mampir Ngombe mengatakan...

Kalau saat terima telepon keluar tulisaan unfortunately lengine has stopped kenapa ya mas?

Unknown mengatakan...

Gan saya donlond aplikasi kinemaster bisa di pasang tpi di buka ad pemberitahuan unfortunately mohon solusiny mkasih

HM mengatakan...

Tolong bantu mas saya juga dapet kasus sperti diatas, penyebab nya ketika pada projek yang saya buat berkaitan dengan data base, nah ketika saya buat class yang membaca database pasti error sperti itu
Tolong bantu mas

Diberdayakan oleh Blogger.