---------------
디펜던시 정리
----------------
맵리듀스 - 분산 처리
하둡 - 데이터를 분산시켜서 모으기
-------------------
https://square.github.io/retrofit/
아래 페이지에서 레트로핏 강의 듣기
레트로핏은 쓰레드 콜백 다된다
통신할 때 인터페이스를 만드는데
어노테이션 @GET을 만들어 놓고
함수를 호출하면 해당주소로 요청하여 제이슨으로 받아서 오브젝트로 저장한다
내 레파지토리가 있는 것처럼 가져올 수 있다
baseUrl에 주소가 있다
헤더도 붙일 수 있다
주소에서 변수받기
--------------
-----------------
implementation 'com.squareup.retrofit2:retrofit:(insert latest version)'
버전 적을 때 괄호 삭제
오류가난다 (Gson 설치해야함)
메이븐레파지토리에서 지선 임플리먼테이션
지선 컨버터 임플리먼테이션
------------
Gson 어노테이션 공부하기
-------------
복붙
androidX가 아니다 주의! 내용만 복사해서 쓰자.
메인액티비티
앱 접근권한
<uses-permission android:name="android.permission.INTERNET" />
에러나면
https://stackoverflow.com/questions/59448845/no-static-method-metafactory
확인
추가
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
https://yts.mx/api#list_movies
----
cors 정책 - cross origin
----
롬복 라이브러리 추가
compileOnly 'org.projectlombok:lombok:1.18.8'
annotationProcessor 'org.projectlombok:lombok:1.18.8'
Yts 모델 생성
package com.jaybon.retrofit2ex01;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Yts {
public String status;
public String statusMessage;
public Data data;
public Meta meta;
@lombok.Data
public class Data {
public long movieCount;
public long limit;
public long pageNumber;
public List<Movie> movies = null;
@lombok.Data
public class Movie {
public long id;
public String url;
public String imdbCode;
public String title;
public String titleEnglish;
public String titleLong;
public String slug;
public long year;
public double rating;
public long runtime;
public List<String> genres = null;
public String summary;
public String descriptionFull;
public String synopsis;
public String ytTrailerCode;
public String language;
public String mpaRating;
public String backgroundImage;
public String backgroundImageOriginal;
public String smallCoverImage;
public String mediumCoverImage;
public String largeCoverImage;
public String state;
public List<Torrent> torrents = null;
public String dateUploaded;
public long dateUploadedUnix;
@lombok.Data
public class Torrent {
public String url;
public String hash;
public String quality;
public String type;
public long seeds;
public long peers;
public String size;
public long sizeBytes;
public String dateUploaded;
public long dateUploadedUnix;
}
}
}
@lombok.Data
public class Meta {
public long serverTime;
public String serverTimezone;
public long apiVersion;
public String executionTime;
}
}
JsonPlaceHolderApi
package com.jaybon.retrofit2ex01;
import java.util.List;
import retrofit2.Call;
import retrofit2.http.GET;
public interface JsonPlaceHolderApi {
@GET("posts")
Call<List<Post>> getPosts();
@GET("list_movies.json&sort_by=rating")
Call<Yts> getYts();
}
메인 액티비티
package com.jaybon.retrofit2ex01;
import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.List;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
private TextView textViewResult;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textViewResult = findViewById(R.id.text_view_result);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://yts.mx/api/v2/")
.addConverterFactory(GsonConverterFactory.create())
.build();
JsonPlaceHolderApi jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
Call<Yts> call = jsonPlaceHolderApi.getYts();
call.enqueue(new Callback<Yts>() {
@Override
public void onResponse(Call<Yts> call, Response<Yts> response) {
if (!response.isSuccessful()) {
textViewResult.setText("Code: " + response.code());
return;
}
Yts yts = response.body();
for (Yts.Data.Movie movie : yts.data.movies) {
String content = "";
content += "ID: " + movie.getId() + "\n";
content += "Title: " + movie.getTitle() + "\n";
content += "Summary: " + movie.getSummary() + "\n";
content += "img: " + movie.getBackgroundImage() + "\n\n";
textViewResult.append(content);
}
}
@Override
public void onFailure(Call<Yts> call, Throwable t) {
textViewResult.setText(t.getMessage());
}
});
}
}
--------------------
쿼리스트링 맵으로 넣기
-------------------
스프링 서버에서 데이터가져오기
https 요청이 아닌 http 요청시! 주의사항
"CLEARTEXT communication to XXXX not permitted by network security policy"
https://gun0912.tistory.com/80
User
package com.jaybon.retrofit2ex01;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {
public long id;
public String username;
public String password;
public String email;
public Object profile;
public String createDate;
}
JsonPlaceHolderApi
package com.jaybon.retrofit2ex01;
import java.util.List;
import java.util.Map;
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.QueryMap;
public interface JsonPlaceHolderApi {
@GET("posts")
Call<List<Post>> getPosts();
@GET("list_movies.json&sort_by=rating")
Call<Yts> getYts();
@GET("userdata")
Call<List<User>> getUsers();
}
MainActivity
package com.jaybon.retrofit2ex01;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class MainActivity extends AppCompatActivity {
private TextView textViewResult;
private static final String TAG = "Main_Activity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textViewResult = findViewById(R.id.text_view_result);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://192.168.0.60:8000/")
.addConverterFactory(GsonConverterFactory.create())
.build();
JsonPlaceHolderApi jsonPlaceHolderApi = retrofit.create(JsonPlaceHolderApi.class);
// 쿼리스트링 만들기
Map<String, String> queryString = new HashMap<>();
queryString.put("sort_by", "rating");
queryString.put("page", "2");
Call<List<User>> call = jsonPlaceHolderApi.getUsers();
call.enqueue(new Callback<List<User>>() {
@Override
public void onResponse(Call<List<User>> call, Response<List<User>> response) {
Log.d(TAG, "onResponse: "+response.message());
Log.d(TAG, "onResponse: "+response.headers());
if (!response.isSuccessful()) {
textViewResult.setText("Code: " + response.code());
return;
}
List<User> users = response.body();
for (User user : users) {
String content = "";
content += "ID: " + user.getId() + "\n";
content += "유저명: " + user.getUsername() + "\n";
content += "이메일: " + user.getEmail() + "\n\n";
textViewResult.append(content);
}
}
@Override
public void onFailure(Call<List<User>> call, Throwable t) {
Log.d(TAG, "onFailure: "+t.getMessage());
textViewResult.setText(t.getMessage());
}
});
}
}
-------------------
피키소 - 이미지 그대로 - 퀄리티
글라이드 - 이미지 용량 줄여서 - 퍼포먼스
유니버셜이미지로더
https://blog.naver.com/getinthere/221636149736
자바에서는 동영상이나 이미지 받을 때 힙메모리 영역에 받는다
그래서 받으면서 힙용량을 늘리는 방식을 쓰든 해야한다
jvm의 힙최대영역은 컴퓨터 메모리의 절반이다
피카소 의존성
메니페스트 인터넷설정
http 요청 설정
사용법
이미지주소와 이미지뷰를 선택만 하면된다
https://github.com/square/picasso
피카소 의존성
implementation 'com.squareup.picasso:picasso:2.71828'
메니페스트 설정
http 요청 설정
Picasso.get()는 IO가 일어나기 때문에 쓰레드와 핸들러가 있을 것을 예상해야한다
-----------------------
글라이드
https://github.com/bumptech/glide
의존성
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
Glide.with(this).load("http://goo.gl/gEgYUd").into(imageView);
'App > Android' 카테고리의 다른 글
안드로이드 // git 연결 해제 (0) | 2020.07.30 |
---|---|
안드로이드 // 영화 리뷰 앱 / 아이템 터치 헬퍼 (0) | 2020.07.30 |
안드로이드 // drawable 이미지 (0) | 2020.07.28 |
안드로이드 // 렐러티브 레이아웃 (0) | 2020.07.28 |
안드로이드 // 리니어 레이아웃 (0) | 2020.07.28 |