상세 컨텐츠

본문 제목

Network

Android(강의정리)

by 낙지지 2020. 11. 23. 13:24

본문

네트워크 -> 통신

DataBase <-----> Server <------> Client(app,web,...)
A
댓글 B

Local DataBase 의 한계
- 동기화가 어렵다
- 상호작용이 불가능 하다


서버와 통신하는 방법
- 해당 url 로 요청한다
- 인증정보를 보낸다
- JSON 형식을 사용해서 data를 보낸다
- JavaScript Object Notation(JSON) -> Javascript에서 객체를 만들 때 사용하는 표현식 이다

JSON 형식
- [] -> List
- {} -> 객체
-> "" -> 문자열
-> ""없으면 -> 숫자


Json Response
[
 {
  "id": 1, -> 문서에 써있다
  "name": "홍길동",
  "age": 20,
  "intro": "나는 홍길동이다!"
 },
 {
  "id": 2,
  "name": "김아무개",
  "age": 10,
  "intro": "난 김아무개 입니다 :)"
 }
]

Json Parsing -> Json을 코틀린이나 자바가 이해할수 있게 변형 하는 과정

Serializable (직렬화)
----------------------->
id, name, age, intro

코틀린이나/ 자바가 이해할수 있는 틀로 바꿔주는 것

class Person(
 var id : Int? = null
 var name : String? = null
 var age : Int? = null
 var intro : String? = null
)

Person(1,"김아무개", 20, "안녕하세요")


Request Type Status Code
- GET -> 정보 요청 -> 200 OK
- POST -> 정보 추가 요청 -> 201 Created
- DELETE -> 정보 삭제 요청
- PUT -> 정보 수정 요청

Status Code
- 200번대 -> 처리가 잘 됬다


Library
- Volly
- Retrofit


- AsyncTask를 상속받는 NetworkTask 클래스 생성

class NetworkTask(
    val recyclerView: RecyclerView,
    val inflater: LayoutInflater, // adapter를 만들 때 필요
    //val context: Context // layoutmanager를 만들 때 필요 -> xml에서 처리
) : AsyncTask<Any?, Any?, Array<PersonFromServer>>() {
    // 여기는 UI쓰레드에 접근이 가능하기 때문에, 여기서 뷰를 그려준다.
    override fun onPostExecute(result: Array<PersonFromServer>?) {
        val adapter = PersonAdapter(result!!, inflater) // !!처리 방식은 개발자가 null이 아님을 증명하는거라 비추천
        recyclerView.adapter = adapter
        //recyclerView.layoutManager = LinearLayoutManager(context)
        super.onPostExecute(result)
    }

    //doInBackground의 return이 onPostExecute의 파라 미터로 들어감
    override fun doInBackground(vararg params: Any?): Array<PersonFromServer> {
        val urlString: String = "http://mellowcode.org/json/students/"
        val url: URL = URL(urlString)
        val connection: HttpURLConnection = url.openConnection() as HttpURLConnection

        connection.requestMethod = "GET"
        connection.setRequestProperty("Content-Type", "application/json")

        // HTTP_OK타고 가면 200임
        var buffer = ""
        if (connection.responseCode == HttpURLConnection.HTTP_OK) {
            Log.d("connn", "inputstream : " + connection.inputStream) // 뭐 알수 없는 로그
            val reader = BufferedReader(
                InputStreamReader(
                    connection.inputStream,
                    "UTF-8"
                )
            )
            buffer = reader.readLine()
            Log.d("connn","buffer : " + buffer) // buffer : [{"id":1,"name":"홍길동","age":20,"intro":"나는 홍길동이다!"},...
        }

        //Json Parsing -> Json을 코틀린이나 자바가 이해할수 있게 변형 하는 과정
        //Serializable (직렬화)
        val data = Gson().fromJson(buffer, Array<PersonFromServer>::class.java) // app수준 gradle에 GSON dependency 추가
        val age = data[0].age
        Log.d("connn","data : " + data) // data : [Lcom.example.myapplication.PersonFromServer;@910163a
        Log.d("connn", "age : " + age) // age : 20

        return data
    }
}


- RecyclerView.Adapter<PersonAdapter.ViewHolder> 상속받는 PersonAdapter 생성

class PersonAdapter(
    val personList: Array<PersonFromServer>,
    val inflater: LayoutInflater
) : RecyclerView.Adapter<PersonAdapter.ViewHolder>() {
    inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val name: TextView
        val age: TextView
        val intro: TextView

        init {
            name = itemView.findViewById(R.id.person_name)
            age = itemView.findViewById(R.id.person_age)
            intro = itemView.findViewById(R.id.person_intro)
        }
    }

    override fun getItemCount(): Int {
        return personList.size
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view = inflater.inflate(R.layout.person_list_item, parent, false)
        return ViewHolder(view)
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.name.setText(personList.get(position).name)
        holder.age.setText(personList.get(position).age.toString())
        holder.intro.setText(personList.get(position).intro)
    }
}

- 메인 클래스

class NetworkActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_network)

        NetworkTask(
            recycler_person,
            LayoutInflater.from(this@NetworkActivity)
            //this@NetworkActivity
        ).execute()
    }
}

Gson라이브러리를 사용하려면 해당 dependency를 sync해야한다

'Android(강의정리)' 카테고리의 다른 글

Retrofit  (0) 2020.11.24
Realm(내장 DB)  (0) 2020.11.23
Async(비동기)  (0) 2020.11.23
Database(SharedPreference)  (0) 2020.11.20
Tablayout, pager(2)  (0) 2020.11.19

관련글 더보기

댓글 영역