개발자

안드로이드 스튜디오 강제 종료 오류 원인이 뭘까요?

2023년 11월 21일조회 257

안드로이드 스튜디오를 이용해서 축구 소셜 매치 어플을 제작하고 있습니다 AlertDialog에서 매치 참가 확정을 누르면 첫번째는 정상 실행되지만 다시한번 참가확정을 누르게되면 어플이 강제 종료가 되는데 원인을 모르겠습니다

1package com.example.project;
2
3import android.app.AlertDialog;
4import android.app.Dialog;
5import android.content.Context;
6import android.content.DialogInterface;
7import android.view.LayoutInflater;
8import android.view.View;
9import android.view.ViewGroup;
10import android.widget.AdapterView;
11import android.widget.BaseAdapter;
12import android.widget.Button;
13import android.widget.ListView;
14import android.widget.TextView;
15import android.widget.Toast;
16
17import androidx.recyclerview.widget.RecyclerView;
18
19import com.google.android.material.floatingactionbutton.FloatingActionButton;
20import com.google.firebase.database.FirebaseDatabase;
21
22import org.w3c.dom.Text;
23
24import java.util.ArrayList;
25
26import javax.crypto.Mac;
27public class HomeListItem extends BaseAdapter {
28    
29    ArrayList<HomeList> homelist=new ArrayList<>();
30    @Override
31    public int getCount() {
32        return homelist.size();
33    }
34
35    @Override
36    public Object getItem(int position) {
37        return homelist.get(position);
38    }
39
40    @Override
41    public long getItemId(int position) {
42        return position;
43    }
44
45    @Override
46    public View getView(int position, View convertView, ViewGroup parent) {
47        Context c= parent.getContext();
48        View dialogView=View.inflate(c,R.layout.match,null);
49        AlertDialog.Builder dlg=new AlertDialog.Builder(c);
50        dlg.setTitle("매치 참가 확인");
51        dlg.setView(dialogView);
52        dlg.setNegativeButton("닫기",null);
53        dlg.setPositiveButton("확정", new DialogInterface.OnClickListener() {
54            @Override
55            public void onClick(DialogInterface dialog, int which) {
56                Toast.makeText(c.getApplicationContext(),"매치 참가 확정되었습니다",Toast.LENGTH_LONG).show();
57            }
58        });
59        if (convertView==null){
60            LayoutInflater li= (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
61            convertView=li.inflate(R.layout.homecutom,parent,false);
62        }
63        Button homebtn1=(Button)convertView.findViewById(R.id.homebtn1);
64        TextView homecustom1=convertView.findViewById(R.id.homecustom1);
65        TextView homecustom2=convertView.findViewById(R.id.homecustom2);
66        TextView homecustom3=convertView.findViewById(R.id.homecustom3);
67        HomeList hl=homelist.get(position);
68        homecustom3.setText(hl.getDay());
69        homecustom1.setText(hl.getName());
70        homecustom2.setText(hl.getTime());
71        homecustom1.setOnClickListener(new View.OnClickListener() {
72            @Override
73            public void onClick(View v) {
74                dlg.show();
75            }
76        });
77        homecustom2.setOnClickListener(new View.OnClickListener() {
78            @Override
79            public void onClick(View v) {
80                dlg.show();
81            }
82        });
83        homebtn1.setOnClickListener(new View.OnClickListener() {
84            @Override
85            public void onClick(View v) {
86                dlg.show();
87            }
88        });
89        return convertView;
90    }
91    public void addHomeList(String name, String day,String time){
92        HomeList hl=new HomeList();
93
94        hl.setName(name);
95        hl.setDay(day);
96        hl.setTime(time);
97
98        homelist.add(hl);
99    }
100}
이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

문승욱(카이론)님의 프로필 사진

코드 상으로 봐서는 setPositiveButton 클릭시에 UI를 만드는거 같은데, 그러면서 핸들러 세팅이 중복되서 그러는것 때문이 아닌가 의심됩니다. UI는 프로그램 시작 혹은 오프닝에서 다 만들어놓은 상태로 show/hide 하는 방식으로 변경하는게 어떨까 싶습니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

AI 답변
커리어리 AI 봇 프로필 이미지

커리어리 AI 봇

GPT가 달아주는 답변입니다.

2023년 11월 21일

안드로이드 스튜디오에서 강제 종료 오류는 다양한 이유로 발생할 수 있습니다. 그러나 질문에서 말씀하신 환경과 소스 코드를 바탕으로 보면, 일단 가장 현저하게 보이는 문제점은 'AlertDialog'가 서로 달라도 같은 참조를 가리키고 있기 때문입니다. 리스트의 각 아이템에 대해, `getView()` 메소드내에서 동일한 'AlertDialog'인 'dlg'를 사용하게 되므로, 여러 아이템에서 동시에 같은 대화상자를 호출하는 경우 충돌이 발생하여 앱이 강제 종료될 수 있습니다. 충돌을 막기 위해서는 리스트 뷰의 각 아이템마다 새로운 AlertDialog 인스턴스가 생성되어야 합니다. `getView()` 메소드 내부에서 확인 버튼을 클릭했을 때 다이얼로그를 표시하는 부분을 함수로 추출하고, 이 함수가 매번 새로운 AlertDialog 인스턴스를 리턴하도록 변경해보세요. 또한, 문제의 원인을 정확히 파악하기 위해서는 앱이 강제 종료되었을 때 발생하는 로그 메시지(특히 'Fatal Exception' 및 'at' 뒤에 나오는 부분)를 확인해보는 것이 중요합니다. 안드로이드 스튜디오의 Logcat 창에서 해당 로그를 볼 수 있습니다.

목록으로

지금 가입하면 모든 질문의 답변을 볼 수 있어요!