네트워크 -> 통신
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()
}
}
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 |
댓글 영역