애플리케이션이 응답하지 않는다는 시스템 메시지이다.

유저가 화면을 터치함에도 불구하고 프로그램이 5초 동안 반응이 없다면, 안드로이드는 이를 용납하지 않고 강제로 어플리케이션을 종료한다.


발생 이유

ANR은 하나의 메인 스레드가 일정 시간 어떤 작업에 잡혀 있으면 발생한다.

무거운 작업들을 하나의 스레드에서 수행하면, action에 대한 반응이 늦춰짐에 따라 유저들을 자극하고, 결국 프로세스를 멈추게 한다.

터치 입력이 5초 내에 처리되지 않았을 때, 브로드캐스트가 10초 내에 처리되지 않았을 때 발생한다.


해결 방법

메인 스레드에서는 오직 UI 컴포넌트만 실행하고, 별도의 스레드에서 처리가 오래 걸리는 작업을 진행한다.

또한 ProgressBar를 이용해 작업의 진행 과정을 알려 사용자가 기다리도록 한다.

사용자의 편의성을 위해 ANR이 발생하지 않도록 유의해야 한다.



참고 출처

ANR의 의미와 예방: http://itmining.tistory.com/3

'Android' 카테고리의 다른 글

스레드 (Thread) - 1. 스레드와 핸들러  (0) 2018.07.24
Context (컨텍스트)  (0) 2018.07.20
프래그먼트(Fragment) 특징  (0) 2018.07.17
바로가기 메뉴 (NavigationDrawer)  (0) 2018.07.11
뷰페이저 (ViewPager)  (0) 2018.07.10

1. 배경

태블릿 화면 같은 넓은 화면을 효율적으로 이용하기 위해 Fragment가 탄생했다. 

예를 들어 설정화면에 각 옵션을 터치했을 때 옵션에 대한 상세화면이 나오는 화면 구성이라면, Activity를 사용했을 때는 각각의 옵션을 선택했을 때 화면 전환이 필요하지만 Fragment를 사용한다면 화면 전환이 없이 한 화면에서 또 다른 화면을 볼 수 있다.


2. 액티비티 일부

Fragment란 조각이란 뜻이다. Fragment는 Activity보다 작은 조각 화면이며 Fragment의 집합이 Activity라 할 수 있다.

하나의 Activity를 분할하여 여러 개의 Fragment를 이용해 화면을 정의할 수 있다.

액티비티 위에 올라가도록 되어 있기 때문에 액티비티가 시스템 역할을 하게 되고, 액티비티보다 가볍게 화면 구성을 할 수 있다.

Fragment는 하나의 Activity의 컨텍스트 안에 있으므로 데이터를 쉽게 공유할 수 있다.

그러나 레이아웃에 고려해야 될 점이 늘어나 코드가 복잡해지는 단점이 있다.


3. 재사용성

다양한 Activity에서 재사용이 가능하고 하나의 Activity에 여러 개의 Fragment를 가질 수 있다.

실행 중에도 추가, 제거, 교체가 가능하기 때문에 동적이고 유연한 화면을 만들 수 있다.

예를 들어 탭이나 스왑 형식의 화면 구성일 때, Fragment를 사용하면 각 탭마다 다른 Fragment를 사용할 수 있어 동일한 Fragment를 재사용할 수 있다.


4. 독립성

Fragment는 자신만의 레이아웃과 Life cycle을 가지는 뷰 객체이기 때문에, Activity 화면 안에 부분 화면을 독립적으로 사용할 수 있다.

Activity가 하나의 XML 레이아웃과 자바 소스파일로 동작하는 것처럼, Fragment도 하나의 XML 레이아웃과 자바 소스파일로 동작한다.


5. 생명주기

프래그먼트 생명주기: http://qlyh8.tistory.com/61?category=726548

프래그먼트 | Android Developers: https://developer.android.com/guide/components/fragments?hl=ko




참고 출처: https://m.blog.naver.com/jaejae1988/60210259603

'Android' 카테고리의 다른 글

Context (컨텍스트)  (0) 2018.07.20
ANR (Application Not Responding)  (0) 2018.07.17
바로가기 메뉴 (NavigationDrawer)  (0) 2018.07.11
뷰페이저 (ViewPager)  (0) 2018.07.10
탭 (Tab)  (0) 2018.07.05

문제 출처: https://www.acmicpc.net/problem/10828



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class algo3_10828_stack {
    
    private static BufferedReader reader;
    private static StringTokenizer tokenizer;
    private static StringBuilder strBuilder;
    
    private static int N, stackSize = 0;
    private static int[] stackArr;
    
    public static void main(String[] args) throws NumberFormatException, IOException {
 
        reader = new BufferedReader(new InputStreamReader(System.in));
        strBuilder = new StringBuilder();
        
        N = Integer.parseInt(reader.readLine());
        stackArr = new int[N];
        
        for(int i=0 ; i<N ; i++){
            stack(reader.readLine());
        }
        System.out.println(strBuilder);
    }
    
    public static void stack(String command){
        tokenizer = new StringTokenizer(command);
        
        switch(tokenizer.nextToken()){
            case "push":
                push(Integer.parseInt(tokenizer.nextToken()));
                break;
            case "pop":
                strBuilder.append(pop() + "\n");
                break;
            case "size":
                strBuilder.append(size() + "\n");
                break;
            case "empty":
                if(empty())
                    strBuilder.append("1\n");
                else
                    strBuilder.append("0\n");
                break;
            case "top":
                strBuilder.append(top() + "\n");
                break;
            default:
                break;
        }
    }
 
    public static void push(int num){
        stackArr[++stackSize] = num;
    }
 
    public static int pop(){
        int num = -1;
        if(stackSize == 0)
            return num;
        else{
            num = stackArr[stackSize];
            stackArr[stackSize--= 0;
            return num;
        }
    }
 
    public static int size(){
        return stackSize;
    }
 
    public static boolean empty(){
        if(stackSize == 0)
            return true;
        else
            return false;
    }
 
    public static int top(){
        if(stackSize == 0)
            return -1;
        else
            return stackArr[stackSize];
    }
}
 
cs




'Algorithm' 카테고리의 다른 글

백준 10799번: 쇠막대기  (0) 2018.07.20
백준 9012번: 괄호  (0) 2018.07.18
백준 1260번: DFS와 BFS  (0) 2018.04.18
BFS (Breadth-First Search)  (0) 2018.04.12
DFS (Depth-First Search)  (0) 2018.04.12

+ Recent posts