본문 바로가기

안드로이드

Retrofit - 피카소 이미지 로드

https://github.com/Moonseonhyeon/android-Picasso/commits/master

 

1. 이미지 주소가 http, https (안드로이드 9.0부터 보안 -> http)

-> 보안 규칙을 해제 (매니페스트)

http://www.topstarnews.net/news/photo/201803/380832_25485_2752.jpg

 

2. 통신 통신을 할 수 있는 권한 (INTERNET권한) (매니페스트)

 

3. 통신을 하기 때문에 시간!! - UI쓰레드(X) => 새로운 쓰레드 생성(o) 쓰레드로 작동해야 한다.

 

4. 라이브러리

Glide (이미지 통신)

Picasso

Universial Image

 

 

https://square.github.io/picasso/

 

Picasso

Introduction Images add much-needed context and visual flair to Android applications. Picasso allows for hassle-free image loading in your application—often in one line of code! Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView); Many c

square.github.io

 

 

안드로이드는 main쓰레드가 화면 ui를 관리한다.

이미지를 인터넷으로 부터 다운받게 되면 그 시간동안 ui가 멈출 수 있다.

그래서 다운로드를 하기 위해서는 새로운 쓰레드를 만들면 된다.

새로운 쓰레드에서 이미지 다운이 완료되면 메인쓰레드에게 데이터를 넘겨줘야 한다. 왜냐하면 새로운 쓰레드는 main쓰레드의 ui에 접근할 수 없기 때문이다.

이러한 복잡한 상황을 피카소 라이브러리를 이용하게 되면 마법처럼 알아서 실행된다.

마법을 사용안하면 runOnUiThread 혹은 Handler 혹은 AsyncTast를 사용해야 한다.

 

 

1. 이미지가 drawable에 있는 것이 아닌 웹사이트상에 있는 주소라면 아래와 같은 라이브러리의 도움이 필요하다.

 

Picaso, Glide, Universal ImageLoader

 

2. Picaso를 이용하여 이미지를 로드해보겠다.

 

 

3. 첫번째로 이미지의 주소가 https 로 시작하는 프로토콜이어야 가능하다.

https 가능

http 불가능

 

* 안드로이드 9.0 이상 부터 보안정책이 변경되어서 그렇다. 매니페스트를 아래와 같이 수정(usesCleartextTraffic="ture")하면 http 사용가능!!

 

<application android:usesCleartextTraffic="true"

  android:allowBackup="true"

  android:icon="@mipmap/ic_launcher"

  android:label="@string/app_name"

  ...생략

</application>

 

4. 두번째로 인터넷과 네트워크 권한을 줘야 한다.

 

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

<uses-permission android:name="android.permission.INTERNET" />

 

이렇게 해도 안되면 AVD가 뻑이 난거니 AVD를 삭제하고 다시 만들면 된다.

 

5. 이전 예제에서 아래의 3가지 부분만 수정해주면 된다.

 

(1) Person.java

 

당연히 getter, setter, constructor 수정해야 한다.

 

  private String image;

 

(2) PersonAdapter.java

 

 

Picasso.get().load("http://i.imgur.com/DvpvklR.png").into(imageView);

 

...생략

public class PersonAdapter extends RecyclerView.Adapter<PersonAdapter.MyViewHolder> {

    ...생략

        public void setItem(Person person){
            tvName.setText(person.getName());
            tvPhone.setText(person.getPhone());
            Picasso.get().load(person.getImage()).into(ivProfile);
        }
    }

    ....생략
}

 

 

 

(3) MainActivity.java

 

...생략

public class MainActivity extends AppCompatActivity {

    ...생략
    private void rvDataSetting(){
        PersonAdapter adapter = new PersonAdapter();

        adapter.addItem(new Person("https://t1.daumcdn.net/cfile/tistory/2225C63A593932870A", "홍길동", "01022228888"));
        adapter.addItem(new Person("https://t1.daumcdn.net/cfile/tistory/2225C63A593932870A", "홍길동", "01022228888"));
        adapter.addItem(new Person("https://t1.daumcdn.net/cfile/tistory/2225C63A593932870A", "홍길동", "01022228888"));
        adapter.addItem(new Person("https://t1.daumcdn.net/cfile/tistory/2225C63A593932870A", "홍길동", "01022228888"));
        adapter.addItem(new Person("https://t1.daumcdn.net/cfile/tistory/2225C63A593932870A", "홍길동", "01022228888"));
        adapter.addItem(new Person("https://t1.daumcdn.net/cfile/tistory/2225C63A593932870A", "홍길동", "01022228888"));
        adapter.addItem(new Person("https://t1.daumcdn.net/cfile/tistory/2225C63A593932870A", "홍길동", "01022228888"));
        adapter.addItem(new Person("https://t1.daumcdn.net/cfile/tistory/2225C63A593932870A", "홍길동", "01022228888"));
        adapter.addItem(new Person("https://t1.daumcdn.net/cfile/tistory/2225C63A593932870A", "홍길동", "01022228888"));
        adapter.addItem(new Person("https://t1.daumcdn.net/cfile/tistory/2225C63A593932870A", "홍길동", "01022228888"));
        recyclerView.setAdapter(adapter);
    }
}