1. 안드로이드 네트워크 통신을 위한 Volley 라이브러리 이용하기
○ 네트워크 통신관련 2개 라이브러리 추천받았다
- Volley(카카오톡이 아마 쓰고 있을 것이다) → 예전 프로젝트들은 이 라이브러리를 쓰고있을 것이다
- Retrofit2 →최근 프로젝트는 이 라이브러리를 쓴다
Volley 라이브러리: https://google.github.io/volley/
2. 안드로이드 네트워크 통신을 위한 AndroidManifest.xml파일 설정하기
<uses-permission android:name="android.permission.INTERNET" />
위의 코드를 추가해준다
※ 에뮬레이터에서 네트워크 통신 되도록 설정하는 방법※
1. res/xml 폴더안에, network_security_config.xml 파일 만든다
▷ 참고로 무료 가상 서버를 이용할것이기 때문에 domain 부분에 위에처럼 넣어준다.
무료 가상 서버: https://jsonplaceholder.typicode.com/
2.AndroidManiFest에 인터넷 권한 준다
밑에 2개의 코드는 application 부분에 넣는다
android:networkSecurityConfig="@xml/network_security_config"
android:usesCleartextTraffic="true"
3. JSON 데이터 파싱(parsing, 안에 있는 데이터를 끄집어내는걸 말한다)하기
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/txtUserId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_marginTop="79dp"
android:text="TextView"
android:textSize="28sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/txtId"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_marginTop="58dp"
android:text="TextView"
android:textSize="28sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtUserId" />
<TextView
android:id="@+id/txtTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_marginTop="79dp"
android:text="TextView"
android:textSize="28sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtId" />
<TextView
android:id="@+id/txtBody"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:layout_marginTop="81dp"
android:text="TextView"
android:textSize="28sp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/txtTitle" />
</androidx.constraintlayout.widget.ConstraintLayout>
package com.example.networkapp1;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class MainActivity extends AppCompatActivity {
TextView txtUserId;
TextView txtId;
TextView txtTitle;
TextView txtBody;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
txtUserId = findViewById(R.id.txtUserId);
txtId = findViewById(R.id.txtId);
txtTitle = findViewById(R.id.txtTitle);
txtBody = findViewById(R.id.txtBody);
// 네트워크 통신을 위한 Volley 라이브러리 사용
RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
// Request 요청을 만들어야한다
JsonObjectRequest request = new JsonObjectRequest(
Request.Method.GET,
"https://jsonplaceholder.typicode.com/posts/7",
null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) { // 네트워크로 제대로 받았을 때
// 1. 데이터를 가져오는 작업
try {
int userId = response.getInt("userId");
int id = response.getInt("id");
String title = response.getString("title");
String body = response.getString("body");
// 2. 화면에 보여주는 작업
txtUserId.setText(userId+""); // userId랑 id는 int형이라 문자열로 바꿔야한다
txtId.setText(id+"");
txtTitle.setText(title);
txtBody.setText(body);
} catch (JSONException e) {
Log.i("Mainactivity", e.toString());
Toast.makeText(MainActivity.this,"네트워크 통신 중 문제 발생",
Toast.LENGTH_SHORT).show();
return;
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}// 데이터 받아왔을 때 실행할 코드
);
JsonArrayRequest request1 = new JsonArrayRequest(
Request.Method.GET,
"https://jsonplaceholder.typicode.com/posts",
null,
new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
try {
// JSONObject jsonObject = response.getJSONObject(0); 이 줄의 코드 안쓰고 밑에 처럼 한줄에 써줄수도 있다
int userId = response.getJSONObject(0).getInt("userId");
int id = response.getJSONObject(0).getInt("id");
String title = response.getJSONObject(0).getString("title");
String body = response.getJSONObject(0).getString("body");
txtUserId.setText(userId+""); // userId랑 id는 int형이라 문자열로 바꿔야한다
txtId.setText(id+"");
txtTitle.setText(title);
txtBody.setText(body);
} catch (JSONException e) {
return;
}
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
queue.add(request1);
}
}
▶ JSON이 어떤형태이냐에따라 넣어야 할 코드가 다르다
이렇게 { }만 있는 형태는 JsonObject라고 한다.
이렇게 [ ] 안에 { }가 있는 형태는 JsonArray라고 한다.
▶try~catch문을 이용해야하는데 주의할 점이 있다!
try안에 로컬변수 만들었을때 같은 함수 안에서 쓰려고해도 안된다는 것이다 왜나하면 try문 밖에서는 못쓰기 때문!
해결방법은 2가지가 있다.
1. try안에 다 같이 넣어준다
2. try 밖에 만들어준다
'모바일 프로그래밍(Android Studio)' 카테고리의 다른 글
Intent 활용 (0) | 2023.07.18 |
---|---|
ActionBar menu 사용하는 방법 (0) | 2023.07.17 |
메뉴 아이콘 이미지 만드는 방법 (0) | 2023.07.13 |
SQLite3 데이터베이스 활용 (0) | 2023.07.13 |
RecyclerView에서 이미지 클릭하면 삭제 관련 AlertDialog뜨게 하기 (0) | 2023.07.12 |