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: 프로그램 종료
'안드로이드' 카테고리의 다른 글
작업스레드 만들기 (0) | 2016.05.03 |
---|---|
Thread를 이용한 Progress Dialog 일정 시간 후 종료시키기 (0) | 2016.05.03 |
안드로이드 데이터베이스 실습 (0) | 2016.05.02 |
안드로이드에서 Rendering Problems 문제 뜰 때 해결법 (0) | 2016.05.02 |
안드로이드 데이터베이스 SQLite (0) | 2016.05.02 |