인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

최성규-방음종합물류도매님의 프로필 이미지
최성규-방음종합물류도매

작성한 질문수

[초중급편] 안드로이드 데이팅 앱 만들기(Android Kotlin)

나와 다른 성별의 유저 불러오기

나와 다른 성별의 유저 불러오기 강의에서 에뮬레이터에서 앱이 켜졌다가 바로 꺼져요.

작성

·

302

0

강의 5:19까지 코드 입력완료하고, 오류코드도 식별되지 않는데,

에뮬레이터를 실행시키면 앱이 실행되고 -> 스플릿화면 -> 메인화면이 뜨자말자 앱이 꺼지네요.

 

에뮬레이터 화면 상에는 '앱이름' keeps stopping 문구가 뜨며 종료되네요.

 

어떤 문제일까요?...

 

답변 11

0

아............... 답답하네요 해결이 안 되니 ㅠ

0

이제는 이렇게 오류코드가 발생합니다.

2024-05-03 23:10:07.067 10337-10337 AndroidRuntime com.example.somethingtalk E FATAL EXCEPTION: main

Process: com.example.somethingtalk, PID: 10337

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.somethingtalk.auth.UserDataModel

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436)

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)

at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:202)

at com.example.somethingtalk.MainActivity$getUserDataList$postListener$1.onDataChange(MainActivity.kt:152)

at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)

at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)

at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)

at android.os.Handler.handleCallback(Handler.java:958)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loopOnce(Looper.java:205)

at android.os.Looper.loop(Looper.java:294)

at android.app.ActivityThread.main(ActivityThread.java:8177)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)


 

0

다음 강의로 넘어가서 그냥 진행하려 하는데도 앱이 계속 팅기네요.. ㅠㅠ 일부 다음 강의에서 쓰인 코드도 같이 작성되어 있습니다.

package com.example.somethingtalk

import android.content.Intent
import android.os.BatteryManager
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.ImageView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.bumptech.glide.Glide
import com.example.somethingtalk.auth.IntroActivity
import com.example.somethingtalk.auth.UserDataModel
import com.example.somethingtalk.setting.SettingActivity
import com.example.somethingtalk.slider.CardStackAdapter
import com.example.somethingtalk.utils.FirebaseAuthUtils
import com.example.somethingtalk.utils.FirebaseRef
import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.ValueEventListener
import com.google.firebase.storage.storage
import com.yuyakaido.android.cardstackview.CardStackLayoutManager
import com.yuyakaido.android.cardstackview.CardStackListener
import com.yuyakaido.android.cardstackview.CardStackView
import com.yuyakaido.android.cardstackview.Direction

class MainActivity : AppCompatActivity() {

    lateinit var cardStackAdapter: CardStackAdapter
    lateinit var manager: CardStackLayoutManager

    private val TAG = "MainActivity"

    private val usersDataList = mutableListOf<UserDataModel>()

    private var userCount = 0

    private lateinit var currentUserGender : String

    private val uid = FirebaseAuthUtils.getUid()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //나와 다른 성별 외 유저를 받아와야 하는데
        // 1. 일단 나의 성별을 알아야함
        // 2. 전체 유저 중 다른...

        var setting = findViewById<ImageView>(R.id.settingIcon)
        setting.setOnClickListener {

            val intent = Intent(this, SettingActivity::class.java)
            startActivity(intent)

        }

        var cardStackView = findViewById<CardStackView>(R.id.cardStackView)
        //카드스택뷰 화면 넘기는 기능
        manager = CardStackLayoutManager(baseContext, object : CardStackListener {
            override fun onCardDragging(direction: Direction?, ratio: Float) {
            }

            override fun onCardSwiped(direction: Direction?) {

                //카드스택뷰 오른쪽으로 화면 넘길때
                if(direction == Direction.Right) {
                    //right라는 메세지를 보내라
                     Toast.makeText(this@MainActivity,"right", Toast.LENGTH_SHORT).show()
                    Log.d(TAG, usersDataList[userCount].uid.toString())
                }

                //카드스택뷰 왼쪽으로 화면 넘길때
                if(direction == Direction.Right) {
                    //left라는 메세지를 보내라
                    Toast.makeText(this@MainActivity, "left", Toast.LENGTH_SHORT).show()

                }

                userCount = userCount + 1

                if(userCount == usersDataList.count()) {
                    getUserDataList(currentUserGender)
                    Toast.makeText(this@MainActivity, "새로운 유저를 받아옵니다.", Toast.LENGTH_LONG).show()
                }

            }

            override fun onCardRewound() {
            }

            override fun onCardCanceled() {
            }

            override fun onCardAppeared(view: View?, position: Int) {
            }

            override fun onCardDisappeared(view: View?, position: Int) {
            }

        })

        cardStackAdapter = CardStackAdapter(baseContext, usersDataList)
        cardStackView.layoutManager = manager
        cardStackView.adapter = cardStackAdapter

//        getUserDataList ()
        getMyUserData()

    }

    private fun getMyUserData(){

        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

                Log.d(TAG, dataSnapshot.toString())
                val data = dataSnapshot.getValue(UserDataModel::class.java)
                // 파이어 베이스에서 제공하는 코드 구성 내에 gender를 추가해서 내 성별을 찾는 코드
                Log.d(TAG, data?.gender.toString())

                currentUserGender = data?.gender.toString()

                getUserDataList(currentUserGender)


            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message
                Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
            }
        }
        FirebaseRef.userInfoRef.child(uid).addValueEventListener(postListener)

    }

    //카드스택뷰 화면에서 유저 데이터를 가져오는 코드
    private fun getUserDataList(currentUserGender : String){

        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

                for (dataModel in dataSnapshot.children) {

                    //데이터를 가지고 오는데 유저 데이터 모델의 형태로 받겠다.
                    val user = dataModel.getValue(UserDataModel::class.java)

                    if(user!!.gender.toString().equals(currentUserGender)) {

                    } else {

                        usersDataList.add(user!!)

                    }


                }

                cardStackAdapter.notifyDataSetChanged()


            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message
                Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
            }
        }
        FirebaseRef.userInfoRef.child(uid).addValueEventListener(postListener)


    }

    //유저의 좋아요를 표시하는 부분
    // 데이터에서 값을 저장해야하는데, 어떤 값을 저장할까..?
    // 나의 uid와 내가 좋아요 한 유저의 uid 값
    private fun userLikeOtherUser(myUid : String, otherUid : String){


    }

}


0

 getMyUserData()

}

private fun getMyUserData(){

    val postListener = object : ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {

            Log.d(TAG, dataSnapshot.toString())
            val data = dataSnapshot.getValue(UserDataModel::class.java)

            Log.d(TAG, data?.gender.toString())

            currentUserGender = data?.gender.toString()

            getUserDataList(currentUserGender)


        }

        override fun onCancelled(databaseError: DatabaseError) {
            // Getting Post failed, log a message
            Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
        }
    }
    FirebaseRef.userInfoRef.child(uid).addValueEventListener(postListener)

}

챗 gpt에 물어보니 위 명령어 코드에서 getMyUserData 명령어 코드에 문제가 있다고 하는거 같아요.

"AppSearch에서 데이터를 가져오는 도중에 발생한 것으로 보입니다."라고 하는데 무슨말인지 모르곘어요

 

개복치개발자님의 프로필 이미지
개복치개발자
지식공유자

안녕하세요
질문을 여러개 넣어주셨는데 아래의 부분을 순서대로 공유해주시겠어요?

1. 강의 어느부분을 수강중이신가요?
2. 어디까진 잘 되었는데 언제부터 안되시나요?
3. 에러 로그가 어떻게 나오나요? 콘솔창 전체가 아니라 빨간색으로 표시된 부분을 스크린샷으로 공유해주세요.

  1. 전체 코드를 실행해볼 수 있게 깃허브 / 구글 드라이브 등으로 공유해주세요.

0

Failed to fetch suggestions from AppSearch, fallback to AGA

java.util.concurrent.CompletionException: java.util.NoSuchElementException: No value present

at java.util.concurrent.CompletableFuture.encodeThrowable(CompletableFuture.java:308)

at java.util.concurrent.CompletableFuture.completeThrowable(CompletableFuture.java:323)

at java.util.concurrent.CompletableFuture$UniAccept.tryFire(CompletableFuture.java:684)

at java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:486)

at java.util.concurrent.CompletableFuture.completeExceptionally(CompletableFuture.java:2138)

at com.google.android.apps.nexuslauncher.allapps.H0.onResult(Unknown Source:59)

at android.app.appsearch.SearchSessionUtil$1.lambda$onResult$0(SearchSessionUtil.java:129)

at android.app.appsearch.SearchSessionUtil$1.$r8$lambda$_nlk9WiPjSfaAsqKYmp0aPvSRC0(SearchSessionUtil.java:1)

at android.app.appsearch.SearchSessionUtil$1$$ExternalSyntheticLambda0.run(R8$$SyntheticClass:13)

at android.os.Handler.handleCallback(Handler.java:958)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loopOnce(Looper.java:205)

at android.os.Looper.loop(Looper.java:294)

at android.os.HandlerThread.run(HandlerThread.java:67)

Caused by: java.util.NoSuchElementException: No value present

at java.util.Optional.get(Optional.java:144)

at com.google.android.apps.nexuslauncher.allapps.H0.onResult(Unknown Source:16)

at android.app.appsearch.SearchSessionUtil$1.lambda$onResult$0(SearchSessionUtil.java:129

at android.app.appsearch.SearchSessionUtil$1.$r8$lambda$_nlk9WiPjSfaAsqKYmp0aPvSRC0(SearchSessionUtil.java:1

at android.app.appsearch.SearchSessionUtil$1$$ExternalSyntheticLambda0.run(R8$$SyntheticClass:13) 

at android.os.Handler.handleCallback(Handler.java:958

at android.os.Handler.dispatchMessage(Handler.java:99

at android.os.Looper.loopOnce(Looper.java:205

at android.os.Looper.loop(Looper.java:294

at android.os.HandlerThread.run(HandlerThread.java:67

 

0

FATAL EXCEPTION: main

Process: com.example.somethingtalk, PID: 10969

com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.somethingtalk.auth.UserDataModel

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436)

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)

at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)

at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:202)

at com.example.somethingtalk.MainActivity$getUserDataList$postListener$1.onDataChange(MainActivity.kt:149)

at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75)

at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63)

at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55)

at android.os.Handler.handleCallback(Handler.java:958)

at android.os.Handler.dispatchMessage(Handler.java:99)

at android.os.Looper.loopOnce(Looper.java:205)

at android.os.Looper.loop(Looper.java:294)

at android.app.ActivityThread.main(ActivityThread.java:8177)

at java.lang.reflect.Method.invoke(Native Method)

at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)

at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)

 

로그캣 오류? 문구입니다.

0

package com.example.somethingtalk

import android.content.Intent
import android.os.BatteryManager
import android.os.Bundle
import android.util.Log
import android.view.View
import android.widget.ImageView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.bumptech.glide.Glide
import com.example.somethingtalk.auth.IntroActivity
import com.example.somethingtalk.auth.UserDataModel
import com.example.somethingtalk.setting.SettingActivity
import com.example.somethingtalk.slider.CardStackAdapter
import com.example.somethingtalk.utils.FirebaseAuthUtils
import com.example.somethingtalk.utils.FirebaseRef
import com.google.firebase.Firebase
import com.google.firebase.auth.auth
import com.google.firebase.database.DataSnapshot
import com.google.firebase.database.DatabaseError
import com.google.firebase.database.ValueEventListener
import com.google.firebase.storage.storage
import com.yuyakaido.android.cardstackview.CardStackLayoutManager
import com.yuyakaido.android.cardstackview.CardStackListener
import com.yuyakaido.android.cardstackview.CardStackView
import com.yuyakaido.android.cardstackview.Direction

class MainActivity : AppCompatActivity() {

    lateinit var cardStackAdapter: CardStackAdapter
    lateinit var manager: CardStackLayoutManager

    private val TAG = "MainActivity"

    private val usersDataList = mutableListOf<UserDataModel>()

    private var userCount = 0

    private lateinit var currentUserGender : String

    private val uid = FirebaseAuthUtils.getUid()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        //나와 다른 성별 외 유저를 받아와야 하는데
        // 1. 일단 나의 성별을 알아야함
        // 2. 전체 유저 중 다른...

        var setting = findViewById<ImageView>(R.id.settingIcon)
        setting.setOnClickListener {

            val intent = Intent(this, SettingActivity::class.java)
            startActivity(intent)

        }

        var cardStackView = findViewById<CardStackView>(R.id.cardStackView)
        //카드스택뷰 화면 넘기는 기능
        manager = CardStackLayoutManager(baseContext, object : CardStackListener {
            override fun onCardDragging(direction: Direction?, ratio: Float) {
            }

            override fun onCardSwiped(direction: Direction?) {

                //카드스택뷰 오른쪽으로 화면 넘길때
                if(direction == Direction.Right) {
                     Toast.makeText(this@MainActivity,"right", Toast.LENGTH_SHORT).show()
                }

                //카드스택뷰 왼쪽으로 화면 넘길때
                if(direction == Direction.Right) {
                    Toast.makeText(this@MainActivity, "left", Toast.LENGTH_SHORT).show()

                }

                userCount = userCount + 1

                if(userCount == usersDataList.count()) {
                    getUserDataList(currentUserGender)
                    Toast.makeText(this@MainActivity, "새로운 유저를 받아옵니다.", Toast.LENGTH_LONG).show()
                }

            }

            override fun onCardRewound() {
            }

            override fun onCardCanceled() {
            }

            override fun onCardAppeared(view: View?, position: Int) {
            }

            override fun onCardDisappeared(view: View?, position: Int) {
            }

        })

        cardStackAdapter = CardStackAdapter(baseContext, usersDataList)
        cardStackView.layoutManager = manager
        cardStackView.adapter = cardStackAdapter

//        getUserDataList()
        getMyUserData()

    }

    private fun getMyUserData(){

        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

                Log.d(TAG, dataSnapshot.toString())
                val data = dataSnapshot.getValue(UserDataModel::class.java)

                Log.d(TAG, data?.gender.toString())

                currentUserGender = data?.gender.toString()

                getUserDataList(currentUserGender)

            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message
                Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
            }
        }
        FirebaseRef.userInfoRef.child(uid).addValueEventListener(postListener)


    }

    //카드스택뷰 화면에서 유저 데이터를 가져오는 코드
    private fun getUserDataList(currentUserGender : String){

        val postListener = object : ValueEventListener {
            override fun onDataChange(dataSnapshot: DataSnapshot) {

                for (dataModel in dataSnapshot.children) {

                    //데이터를 가지고 오는데 유저 데이터 모델의 형태로 받겠다.
                    val user = dataModel.getValue(UserDataModel::class.java)

                    if(user!!.gender.toString().equals(currentUserGender)) {

                    } else {

                        usersDataList.add(user!!)

                    }


                }

                cardStackAdapter.notifyDataSetChanged()


            }

            override fun onCancelled(databaseError: DatabaseError) {
                // Getting Post failed, log a message
                Log.w(TAG, "loadPost:onCancelled", databaseError.toException())
            }
        }
        FirebaseRef.userInfoRef.child(uid).addValueEventListener(postListener)


    }
}

 최종 코드입니다.

0

다시 코드를 전체적으로 작성해서 했는데... 다시 팅기네요

0

강의를 다시보면서 1번 해당사항인 앱 코드를 다시 수정했습니다.

1:13경에 마이 페이지 액티비티에서 복사해온

위 명령어코드를 메인 액티비티에 다시 입력해서 강의와 같이 수정을 하니 다행히 아래처럼 에뮬레이터는 실행이 되고 최초에 오류가 났던 keeps stopping 문구 뜨는 오류처럼 팅기진 않네요. 근데 사진이 안 뜨는 것 같아요.

0

1번은 강의 5번 돌려가면서 했는데 차이점을 찾지 못했습니다. ㅠㅠ

2번 내요은 이번 강의에서 매니패스트 손댄게 없는데, 액티비티가 제대로 선언됐는지 어떻게 확인하나요?...

3번은 우선 최종적으로 안되면 재설치해보겠습니다.

4번은 로그 확인 하는 방법을 몰라서 어떤 부분에서 문제가 발생했는지 모르겠습니다. ㅠㅠ

0

안녕하세요, 인프런 AI 인턴입니다.
님의 질문에 답변드립니다.

앱이 바로 꺼지는 이유는 여러 가지가 있을 수 있습니다. 에러 메시지인 ‘앱이름’ keeps stopping은 일반적으로 앱이 예상치 못한 이유로 종료되었음을 나타냅니다. 가장 흔한 문제 중 몇 가지를 짚어보겠습니다.

  1. 앱의 코드에 런타임 에러가 발생했을 수 있습니다.: 강의 내용을 따라했음에도 불구하고 누락된 코드가 없는지, 타이핑 실수는 없는지 확인해보세요.
  2. AndroidManifest.xml 설정 문제: Android 앱의 실행과 관련된 중요 설정이 포함되어 있는 파일입니다. 액티비티가 제대로 선언되었는지 확인하세요.
  3. 에뮬레이터 문제: 때때로 에뮬레이터 자체의 문제로 앱이 제대로 실행되지 않을 수 있습니다. 에뮬레이터를 다시 시작하거나 새로운 에뮬레이터 인스턴스를 생성해 보세요.
  4. 로그 확인: Android Studio의 Logcat을 확인하여 앱이 종료되는 정확한 시점과 그 원인에 대한 로그를 찾아보세요. 이 로그는 앱이 충돌하는 원인을 찾는 데 매우 유용합니다.

위의 방법으로도 문제를 해결하지 못한다면, 코드 일부를 점검해보거나 관련 커뮤니티에 자세한 에러 로그와 함께 질문을 올리시는 것을 추천드립니다. 추가적으로 Kotlin과 관련된 자료를 찾아보시려면 Kotlin 공식 문서Spring Boot와 Kotlin을 활용한 프로젝트 등의 리소스를 활용하시는 것도 도움이 될 것입니다.

최성규-방음종합물류도매님의 프로필 이미지
최성규-방음종합물류도매

작성한 질문수

질문하기