작성
·
302
답변 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에서 데이터를 가져오는 도중에 발생한 것으로 보입니다."라고 하는데 무슨말인지 모르곘어요
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은 일반적으로 앱이 예상치 못한 이유로 종료되었음을 나타냅니다. 가장 흔한 문제 중 몇 가지를 짚어보겠습니다.
위의 방법으로도 문제를 해결하지 못한다면, 코드 일부를 점검해보거나 관련 커뮤니티에 자세한 에러 로그와 함께 질문을 올리시는 것을 추천드립니다. 추가적으로 Kotlin과 관련된 자료를 찾아보시려면 Kotlin 공식 문서나 Spring Boot와 Kotlin을 활용한 프로젝트 등의 리소스를 활용하시는 것도 도움이 될 것입니다.
안녕하세요
질문을 여러개 넣어주셨는데 아래의 부분을 순서대로 공유해주시겠어요?
1. 강의 어느부분을 수강중이신가요?
2. 어디까진 잘 되었는데 언제부터 안되시나요?
3. 에러 로그가 어떻게 나오나요? 콘솔창 전체가 아니라 빨간색으로 표시된 부분을 스크린샷으로 공유해주세요.
전체 코드를 실행해볼 수 있게 깃허브 / 구글 드라이브 등으로 공유해주세요.