호야2
108
2021-07-14 12:59:11 작성 2021-07-14 13:10:38 수정됨
2
113

안드로이드 onCreate(), onPrepareOptionsMenu() 와 volley 관련 질문드립니당


안녕하세요! 안드로이드 게시판을 공부중인 한 학생입니당.

다름이 아니라 제가 게시판을 들어갔을 때

글의 작성자와 현재 접속한 아이디의 닉네임이 같으면 툴바의 메뉴를 활성화하고,

같지 않으면 툴바의 메뉴를 비활성화 하려는 코드를 만드려고 하는데요!


해당 게시글 번호는 intent 를 통해서 값을 받아오고 있고.

현재 접속한 아이디의 닉네임은 SharedPreferences 를 통해 받아오고 있습니다.


그래서 저 두 변수를 volley 통신에 활용하며 데이터베이스에서 비교하려는 계획을 가지고 실행을 했으나,

저 두개의 변수를 전역변수에 넣어버리면 해당 액티비티로 이동할 때 안드로이드가 튕겨버리더라구요..


onCreate() 혹은 onPrepareOptionsMenu() 안에 넣어야만 액티비티가 정상적으로 작동하는 모습이었습니다.


저는 volley 통신을 한 번만 이용해 메뉴 활성화, 해당 번호의 게시글 내용을 불러옴으로 속도도 높이고, 코드 효율도 높이려고 했는데, 생명주기를 보니 onPrepareOptionsMenu() 후에 onCreate() 를 불러오더라구요.


그러면 결국 volley 통신을 저 둘 모두에서 실행하게 되면서 속도도 느려지고.. 코드 효율성도 떡락해버리는 결과를 낳게 되었는데...


제가 이야기를 잘 못하긴 했지만 이런 경우 방법이 있을까요?

코드의 효율성을 늘릴 수 있는 방법이... 있을까요...?


두 함수 내에서 모두 volley 통신을 해야만 할까요? 내공있는 개발자분들 도와주세요~!~!


코드도 함께 첨부합니다!


    override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
        Log.d("onPrepareOptionsMenu", "START")
        menuInflater.inflate(R.menu.board_menu, menu)
        val more = menu?.findItem(R.id.action_more)
        val boardid = intent.getIntExtra("bnum", 0)
        var pref: SharedPreferences = getSharedPreferences("mine", Context.MODE_PRIVATE) // 초기화
        val nickname = pref.getString("nickname", "").toString() // 저장한 값 불러오는 과정

        val DetailresponseListener = Response.Listener<String> { response ->
            try {
                val jsonObject = JSONObject(response)
                val success = jsonObject.getBoolean("success")
                val writer = jsonObject.getString("writer")
                if (success == true) {
                    Toast.makeText(applicationContext, "메뉴 불러오기 성공", Toast.LENGTH_LONG).show()
                    if(nickname == writer) {
                        more?.setVisible(true)
                    } else {
                        more?.setVisible(false)
                    }
                } else { // 로그인에 실패한 경우
                    Toast.makeText(applicationContext, "메뉴 불러오기 실패!", Toast.LENGTH_LONG).show()
                    return@Listener
                }
            } catch (e: JSONException) {
                e.printStackTrace()
            }
        }
        val detailRequest = DetailRequest(boardid, DetailresponseListener)
        val queue = Volley.newRequestQueue(this@DetailActivity)
        queue.add(detailRequest)

        return true
    }


override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.detail)
var pref: SharedPreferences = getSharedPreferences("mine", Context.MODE_PRIVATE) // 초기화
val nickname = pref.getString("nickname", "").toString() // 저장한 값 불러오는 과정
val boardid = intent.getIntExtra("bnum", 0)
// 저장 값이 없으면 ""(공백)으로 불러옴


val DetailresponseListener = Response.Listener<String> { response ->
try {
val jsonObject = JSONObject(response)
val success = jsonObject.getBoolean("success")
val title = jsonObject.getString("title")
val content = jsonObject.getString("content")
val writer = jsonObject.getString("writer")
val date = jsonObject.getString("date")
if (success == true) {
Toast.makeText(applicationContext, "게시판 불러오기 성공!", Toast.LENGTH_LONG).show()
detail_content.text = content
detail_title.text = title
detail_writer.text = writer
detail_date.text = date
if(nickname == writer) {
}
} else {
Toast.makeText(applicationContext, "게시판 불러오기 실패!", Toast.LENGTH_LONG).show()
return@Listener
}
} catch (e: JSONException) {
e.printStackTrace()
}
}
//서버로 Volley를 이용해서 요청함.

val detailRequest = DetailRequest(boardid, DetailresponseListener)
val queue = Volley.newRequestQueue(this@DetailActivity)
queue.add(detailRequest)


0
  • 답변 2

  • OkkyActivity
    418
    2021-07-14 14:06:57

    다른 앱들도 잘 살펴보시면 기본 화면을 구성해 놓고 네트워크 결과에 따라 화면을 갱신하는 방법을 사용합니다~


    당연히, 통신보다 뷰가 먼저 그려지기 때문에, 뷰가 그려지기 이전에는 데이터를 먼저 알수 없습니다.

    뷰가 그려졌을때는 기본 더미 이미지, 디폴트 값들을 보여주고, 

    통신 결과에 따라 뷰를 갱신하는 방법을 많이 사용합니다


    작성자님의 케이스는 게시판 상세로 진입했을 때, 작성자가 본인이라면 상단의 메뉴를 활성화 해서 [수정] [삭제] 등을 보여주고 싶으신 것 같은데요,


    이런 경우 보통은 상단 메뉴를 일단 비활성화 해놓고, 

    통신 결과에 따라 본인이라면 메뉴를 보이게 해주는 쪽으로 개발을 하게 됩니다~


    학생이신데 코드 효율성까지 고려하시는 모습이 보기 좋네요


    추가로, 통신 모듈은 Retrofit 으로 사용하시길 바랍니다~

  • 호야2
    108
    2021-07-14 15:16:05

    많은 조언 감사드립니다!


    그렇다면 예를 들어, onCreate 에서 통신 후 통신이 완료됐는지 알 수 있는 변수 val ok 를 넣고, ok 가 1일 때 메뉴를 활성화한다는 이야기로 알아들으면 될까요 ?.?


    그렇다면 onPrepareOptionsMenu 를 onCreate 안으로 넣어야 한다는 말씀이신지 궁금합니당! 허접한 학생이라 질문이 많네요 ... .죄송합니당 ㅠ-ㅠ

  • 로그인을 하시면 답변을 등록할 수 있습니다.