ANR(Application Nor Responding)

안드로이드 앱에서 5초 이내에 반응 없는 강제 종료. ANR이 발생 가능 앱은 스레드를 생성하여 처리한다.



1. 레이아웃

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.progdv.chap10_thread.MainActivity">

<Button
android:id="@+id/btnANR"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ANR 강제발생" />

</RelativeLayout>






2. 실행 클래스


package com.progdv.chap10_thread;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

Button btnANR;

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

btnANR = (Button)findViewById(R.id.btnANR);
btnANR.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
play();
}
});
}

public void play() {
boolean flag = true;
int num = 0;
while(flag) { // 무한루프 구성
num++;

if(num > 20) {
flag = false; // 무한루프 탈출용
}

try {
Thread.sleep(10000); // 10초 대기
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("MyLog", "수행 중...");
}
Log.i("MyLog", "프로그램 종료");
}

}

안드로이드 스튜디오 하단 모니터에 다음과 같이 뜬다.


05-02 16:29:07.993 2772-2772/com.progdv.chap10_thread I/MyLog: 수행 중...

05-02 16:29:12.994 2772-2772/com.progdv.chap10_thread I/MyLog: 수행 중...

05-02 16:29:12.994 2772-2772/com.progdv.chap10_thread I/MyLog: 프로그램 종료


화면에 종료 메시지가 떠서 강제로 종료시킬 수 있다.







1-2) 레이아웃

ANR 제거 버튼을 추가해준다.

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.progdv.chap10_thread.MainActivity">

<Button
android:id="@+id/btnANR"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ANR 강제발생" />

<Button
android:id="@+id/btnNoANR"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="ANR 제거"
android:layout_below="@+id/btnANR"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />

</RelativeLayout>






2-2) 실행


package com.progdv.chap10_thread;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;

public class MainActivity extends AppCompatActivity {

Button btnANR, btnNoANR;

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

btnANR = (Button)findViewById(R.id.btnANR);
btnANR.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
play();
}
});

btnNoANR = (Button)findViewById(R.id.btnNoANR);
btnNoANR.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
play();
}
});
thread.start();
}
});



}

public void play() {
boolean flag = true;
int num = 0;
while(flag) { // 무한루프 구성
num++;

if(num > 20) {
flag = false; // 무한루프 탈출용
}

try {
Thread.sleep(10000); // 10초 대기
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("MyLog", "수행 중...");
}
Log.i("MyLog", "프로그램 종료");
}

}



05-02 16:52:35.559 8874-9120/com.progdv.chap10_thread I/MyLog: 수행 중...

05-02 16:52:45.559 8874-9120/com.progdv.chap10_thread I/MyLog: 수행 중...

05-02 16:52:55.559 8874-9120/com.progdv.chap10_thread I/MyLog: 수행 중...

05-02 16:53:05.560 8874-9120/com.progdv.chap10_thread I/MyLog: 수행 중...

05-02 16:53:05.560 8874-9120/com.progdv.chap10_thread I/MyLog: 프로그램 종료



Posted by netyhobby
,