728x90
Android studio (안드로이드 스튜디오) Network 통신, retrofit2, stetho
이 글은 이클립스 서버와의 통신을 다룬다.
Retrofit은 안드로이드에서 서버와의 통신을 위한 Square사의 라이브러리
HTTP API를 Java 인터페이스로 전환한다.
서버와의 통신을 할 때 AsyncTask 를 사용하지만 속도가 느리다는 단점이 있다.
그렇기 때문에 성능적으로 더 좋은 Restrofit 을 사용하려고 한다.
stetho 라이브러리는 페이스북에서 개발된 안드로이드 디버깅 툴이다.
build.gradle (:app)
retrofit
implementation 'com.squareup.retrofit2:retrofit:2.5.0'
implementation 'com.squareup.retrofit2:converter-gson:2.5.0'
stetho
implementation 'com.facebook.stetho:stetho:1.5.1'
implementation 'com.facebook.stetho:stetho-okhttp3:1.5.1'
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
네트워크 통신 점검 : chrome://inspect/#devices
public class MainActivity extends AppCompatActivity {
String url = "https://api.github.com/"; //베이스 url
TextView textView;
MyService service;
//Stetho Debugging address
//chrome://inspect/#devices //네트워크 통신 점검
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Stetho.initializeWithDefaults(this);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addNetworkInterceptor(new StethoInterceptor())
.build();//StethoInterceptor 여기서 client 로 채간다
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.client(okHttpClient) //Stetho
.addConverterFactory(GsonConverterFactory.create())
.build();
//베이스 url 뒤 서비스 파일 만들기 //인터페이스로
service = retrofit.create(MyService.class);
textView = findViewById(R.id.text1);
textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
requestUserRepo();
}
});
}
public void postUser(){
Call<JsonObject> postUser = service.postUser("홍길동" ,25);
postUser.enqueue(new Callback<JsonObject>() {
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
}
@Override
public void onFailure(Call<JsonObject> call, Throwable t) {
}
});
}
public void requestUserRepo(){
Call<JsonObject> requestUserRepo = service.getUseRepositories("llsrrll96");
requestUserRepo.enqueue(new Callback<JsonObject>() { //비동기 , 통신 보내기
@Override
public void onResponse(Call<JsonObject> call, Response<JsonObject> response) {
}
@Override
public void onFailure(Call<JsonObject> call, Throwable t) {
}
});
}
}
public interface MyService
{
//베이스 url이후로 붙는다 // 요청할 주소 , {user 에 useName 이 들어간다}
@GET("users/{user}/repos")
Call<JsonObject> getUseRepositories(@Path("user")String useName); //Json 형식
//body 데이터 실어 보내기
@FormUrlEncoded
@POST("users/repos")
Call<JsonObject> postUser(@Field("username")String name,
@Field("age")int age);
//username 타입은 String , age 타입은 int
}
이클립스 서버와 통신
<간단한 이클립스 서버>
public class moblieMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ServerSocket server = new ServerSocket(55555);
//사용자 접속
System.out.println("사용자 접속 대기");
Socket socket = server.accept();
System.out.println("socket:" +socket);
//입출력 스트림을 추출한다.
InputStream is = socket.getInputStream();
OutputStream os =socket.getOutputStream();
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(os);
dos.writeInt(100);
dos.writeUTF("서버가 보낸 문자열");
int intData = dis.readInt();
String stringData = dis.readUTF();
System.out.println("intData: "+ intData);
System.out.println("stringData: "+ stringData);
socket.close();
server.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
안드로이드 스튜디오
<메인.java>
public class MainActivity extends AppCompatActivity {
TextView textview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textview = findViewById(R.id.textView);
}
public void btnThread(View view)
{
//이클립스와 연결시켜 이클립스에서 만든 서버와 통신 가능
//이클립스 moblieMain 클래스
NetwordThread networdThread = new NetwordThread();
networdThread.start();
}
class NetwordThread extends Thread{
@Override
public void run() {
try {
//서버 접속
final Socket socket = new Socket("192.168.0.3",55555); //localhost = 애뮬레이터다
//입출력 스트림 추출
InputStream is = socket.getInputStream();
OutputStream os =socket.getOutputStream();
DataInputStream dis = new DataInputStream(is);
DataOutputStream dos = new DataOutputStream(os);
//받기
final int intData = dis.readInt();
final String stringData = dis.readUTF();
//보내기
dos.writeInt(100);
dos.writeUTF("앱에서 보낸 문자열");
runOnUiThread(new Runnable() {
@Override
public void run() {
textview.setText(""+intData+"\n");
textview.append(stringData); }
});
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
서버랑
데이터 타입이 같아야되고
콜백 형태에 비동기로 실행된다. 그래서
동기화 하기가 힘들다.
'Front-end > Android (안드로이드 앱 개발)' 카테고리의 다른 글
Android studio (안드로이드 스튜디오) 구글 API 설정하기, google api (0) | 2020.03.22 |
---|---|
Android studio (안드로이드 스튜디오) Authrization 위험권한 부여하기 permission (0) | 2020.03.18 |
Android studio (안드로이드 스튜디오) AsyncTask, Background 백그라운드 (0) | 2020.03.16 |
Android studio (안드로이드 스튜디오) SharedPreference 초기 설정값 저장, 간단한 데이터 저장 용이 / GSON (0) | 2020.03.15 |
Android studio (안드로이드 스튜디오) Pager, TabLayout/ 페이저, 탭레이아웃 (0) | 2020.03.12 |
댓글