---------------
디펜던시 정리
----------------
맵리듀스 - 분산 처리
하둡 - 데이터를 분산시켜서 모으기
-------------------
https://square.github.io/retrofit/
Retrofit
A type-safe HTTP client for Android and Java
square.github.io
아래 페이지에서 레트로핏 강의 듣기
Tutorials - Coding in Flow
⭐ Newest Tutorials Language Tutorials Kotlin Android Tutorials 🏛️ Architecture & Best Practices Room + ViewModel + LiveData + RecyclerView (MVVM) Dagger 2 View Binding Data Binding Testing 📏 Layout ... Read more
codinginflow.com
레트로핏은 쓰레드 콜백 다된다
통신할 때 인터페이스를 만드는데
어노테이션 @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
No static method metafactory
I have an issue with my app that when I log in, the app crashes and I get the error: java.lang.NoSuchMethodError: No static method metafactory(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/Str...
stackoverflow.com
확인
추가
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
https://yts.mx/api#list_movies
API Documentation - YTS YIFY
Official YTS YIFY API documentation. YTS offers free API - an easy way to access the YIFY movies details.
yts.mx
----
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
[안드로이드]CLEARTEXT communication to XXXX not permitted by network security policy
"CLEARTEXT communication to XXXX not permitted by network security policy" 어느날 코드를 바꾼게 없는데도 위와 같은 오류가 발생하면서 앱이 실행이 안되는 일이 발생합니다. 그 이유는 여러분 혹은 사용자..
gun0912.tistory.com
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
안드로이드 RecyclerView.Adapter를 이용한 RecyclerView 5 (Retrofit2) 구글 Glide 이미지로더
Picasso 대신 Glide 사용하기https://github.com/bumptech/glideGlide는 구글에서 만든 이미지 로더 라...
blog.naver.com
자바에서는 동영상이나 이미지 받을 때 힙메모리 영역에 받는다
그래서 받으면서 힙용량을 늘리는 방식을 쓰든 해야한다
jvm의 힙최대영역은 컴퓨터 메모리의 절반이다
피카소 의존성
메니페스트 인터넷설정
http 요청 설정
사용법
이미지주소와 이미지뷰를 선택만 하면된다
https://github.com/square/picasso
square/picasso
A powerful image downloading and caching library for Android - square/picasso
github.com
피카소 의존성
implementation 'com.squareup.picasso:picasso:2.71828'
메니페스트 설정
http 요청 설정
Picasso.get()는 IO가 일어나기 때문에 쓰레드와 핸들러가 있을 것을 예상해야한다
-----------------------
글라이드
https://github.com/bumptech/glide
bumptech/glide
An image loading and caching library for Android focused on smooth scrolling - bumptech/glide
github.com
의존성
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 |