728x90
반응형

지금 프로젝트에서 구분자를 받아와서 해당 구분자로 기존 리소스를 스플래시로 띄우는 것을 구현해놓았다.

 

https://liveforownhappiness.tistory.com/138

 

[ React Native ] Dynamic splash screen 적용하기

현재 맡은 프로젝트가 테이블에 들어가는 앱인데,  해당 앱은 제조사가 모두 본인들의 splash screen 을 사용하고 싶어했다. 여러 라이브러리를 찾아보던중, 그냥 기존에 쓰던 splash screen 을 patch-pa

liveforownhappiness.tistory.com

 

기획쪽에서, 스플래시 스크린의 교체를 요청해왔는데,

 

초기에 스플래시 스크린의 구분자와 리소스가 바뀔확률이 0에 가깝다고 개발을 구분자와 리소스로 해놓았는데

 

앞으로도 해당 교체가 있을것 같아서

 

서버에서 url 을 받아와 구현하는 것으로 변경했다.

 

일단 서버에서 url을 받아온뒤, 해당 url을 splash 스크린에서 세팅해주도록 변경하였다.

 

일단 전에 작업되어있던 

 

RNSharedPreferences

(위에 링크 게시물 참고)

에 웹 리소스 uri 값을 native 쪽으로 내려줬다.

 

SplashScreen.java 코드를

 

public static void show(final Activity activity, final int themeResId, final boolean fullScreen, final String code, final String uri) {
if (activity == null) return;
mActivity = new WeakReference<Activity>(activity);
 
Context context = activity.getApplicationContext();
SharedPreferences sharedPref = context.getSharedPreferences(
"splash", Context.MODE_PRIVATE);

activity.runOnUiThread(new Runnable() {
 
@Override
public void run() {
if (!activity.isFinishing()) {
mSplashDialog = new Dialog(activity, themeResId);

mSplashDialog.setContentView(R.layout.launch_screen);


if(!String.valueOf(code).equals("X")){ //Beaver
// mSplashDialog.setContentView(R.layout.launch_screen);

imageView = (ImageView) mSplashDialog.findViewById(R.id.image);
// imageView = mSplashDialog.findViewById(R.id.imageView);
// imageView = this.findViewById(R.id.imageView);
Log.d("uri : ", uri);
// imageView.setImageURI(Uri.parse(uri));

 
new Thread(() -> {
try{
URL myUrl = new URL(uri);
InputStream inputStream = (InputStream)myUrl.getContent();
Drawable drawable = Drawable.createFromStream(inputStream, null);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageDrawable(drawable);
}
});
 
}catch(MalformedURLException ex){
//do exception handling here
// Log.e("error : ", ex);
}catch(IOException ex){
// Log.e("error : ", ex);
}
}).start();
 
}

// if(String.valueOf(code).equals("L")){ //LG
// mSplashDialog.setContentView(R.layout.launch_screen_lg);
// }
// if(String.valueOf(code).equals("S")){ //SK
// mSplashDialog.setContentView(R.layout.launch_screen_sk);
// }
// if(String.valueOf(code).equals("D")){ //D
// mSplashDialog.setContentView(R.layout.launch_screen_d);
// }
// if(String.valueOf(code).equals("B")){ //Beaver
// mSplashDialog.setContentView(R.layout.launch_screen);
// }



mSplashDialog.setCancelable(false);
if (fullScreen) {
setActivityAndroidP(mSplashDialog);
}
if (!mSplashDialog.isShowing()) {
mSplashDialog.show();
}
}
}
});
}

 

이렇게 수정해주었다.

 

기존 image view 에 .setImageURI(Uri.parse(uri)) 값으로 리소스를 세팅해주니

 

resolveUri failed on bad bitmap uri

 

라는 에러가 나와

 

new Thread(() -> {
try{
URL myUrl = new URL(uri);
InputStream inputStream = (InputStream)myUrl.getContent();
Drawable drawable = Drawable.createFromStream(inputStream, null);
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
imageView.setImageDrawable(drawable);
}
});
 
}catch(MalformedURLException ex){
//do exception handling here
// Log.e("error : ", ex);
}catch(IOException ex){
// Log.e("error : ", ex);
}
}).start();

 

해당 작업중 inputstream.에 url  content() 를 담아 Drawble 로 생성했다.

 

해당과정에서 통신은 새로운 Thread 에서 돌려야하기때문에 new Thread 로 새로운 쓰레드를 만들어줬고

 

또한 UI 업데이트는 메인쓰레드에서만 하기때문에, runOnUiThread 로 imageView 업데이트를 진행했다.

 

이제 서버에서 이미지링크를 내려주면 해당 이미지로 스플래시를 세팅하여 보여주고 앱이 실행된다.

728x90
반응형

+ Recent posts