프로그래밍/안드로이드

안드로이드 쓰레드로 ANR(Application not response)방지법

가카리 2012. 8. 22. 21:38
반응형

쓰레드의 활용

 

ANR이란

 

응용프로그램이 5초이상 사용자의 입력에 반응하지않을때

브로드캐스트 리시버가 10초내로 리턴하지 않을때

 

사용자에게 프로그램을 강제로 죽일지 아니면 놔둘지 뜨는 대화상자를 말합니다.

 

다음 코드는 시간이 오래 걸리는 것을 처리하는 방법입니다.

 

main.xml

 

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

> 

<TextView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="업로드를 시작하려면 다음 버튼을 누르세요."

/>

<Button

       android:id="@+id/upload"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:onClick="mOnClick"

android:text="Upload"

/>

</LinearLayout>

 

 

 

자바파일

 

package com.android.ex98;

 

import android.app.*;

import android.os.*;

import android.view.*;

import android.widget.*;

 

public class ex98 extends Activity {

       boolean bUploading = false;

       public void onCreate(Bundle savedInstanceState) {

             super.onCreate(savedInstanceState);

             setContentView(R.layout.main);

       }

      

       public void mOnClick(View v) {

             if (bUploading) return;//동일 작업에 대한 재진입을 금지시키기 위해서 썼음

            

             //장시간 걸리는 작업은 쓰레드로 분리한다

             Thread uploadThread = new Thread() {

                    public void run() {

                           doUpload();//장시간 걸리는 작업 쓰레드 내부에서 토스트메시지를 쓰면 뻗는다

                           //쓰레드에서는 UI 관련된 어떠한 동작도 없다.

                           mCompleteHandler.sendEmptyMessage(0);//작업이 끝난후 할일은 핸들러로 분리한다

                    }

             };

             bUploading = true;

             uploadThread.start();

       }

 

       public Handler mCompleteHandler = new Handler() {//여기가 핸들러로 처리하는 부분이다

             public void handleMessage(Message msg) {

                    bUploading = false;

                    Toast.makeText(ex98.this, "업로드를 완료했습니다.", 0).show();

             }

       };

      

       void doUpload() {

             for (int i = 0; i < 100; i++) {

                    try { Thread.sleep(100); } catch (InterruptedException e) {;}

             }

       }

}

 

 

 

 

반응형