Android 스트링 이미지 디코딩 관련

조회수 546회

스프링 서버에서 이미지를 encodeBase64String으로 string으로 변환해준 다음 JSON으로 key value값으로 안드로이드로 넘겨줍니다. 그런데 안드로이드에서 이미지에서만 자꾸 오류가 뜨네요 코드입니다.

MainActivity.java

class BackgroundTask extends AsyncTask { String target;

    @Override
    protected void onPreExecute()
    {
        target="아이피";
    }

    @Override
    protected String doInBackground(Void... voids)
    {
        try
        {
            URL url=new URL(target);
            HttpURLConnection httpURLConnection=(HttpURLConnection)url.openConnection();
            InputStream inputStream=httpURLConnection.getInputStream();
            BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(inputStream,"utf-8"));
            String temp;
            StringBuilder stringBuilder=new StringBuilder();
            while((temp=bufferedReader.readLine())!=null)
            {
                stringBuilder.append(temp+"\n");
            }
            bufferedReader.close();
            inputStream.close();
            httpURLConnection.disconnect();

            Log.d("message",stringBuilder.toString().trim());
            return stringBuilder.toString().trim();

        }catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;

    }

    @Override
    public void onProgressUpdate(Void... values)
    {
        super.onProgressUpdate(values);
    }

    public void onPostExecute(String result)
    {
        try{
            JSONObject jsonObject=new JSONObject(result);
            JSONArray jsonArray=jsonObject.getJSONArray("response");
            int count=0;
            String postUserid,postTitle,postContents,postDate;


            while(count<jsonArray.length()){
                JSONObject object=jsonArray.getJSONObject(count);
                postUserid=object.getString("creatorId");
                postTitle=object.getString("title");
                postContents=object.getString("contents");
                postDate=object.getString("image");
                adapter.addItem(new Person(postUserid,postTitle,postContents,postDate));
                count++;

            }

        }catch (Exception e){

        }
    }


}

위에서 image값으로 String으로 받아줍니다. 그리고 Person객체파라미터로 집어 넣고

Person.java

public class Person {

String userId; String title; String contents; String image;

public Person(String userId, String title, String contents, String image) {
    this.userId = userId;
    this.title = title;
    this.contents = contents;
    this.image=image;
}

public String getUserId() {
    return userId;
}

public void setUserId(String userId) {
    this.userId = userId;
}

public String getTitle() {
    return title;
}

public void setTitle(String title) {
    this.title = title;
}

public String getContents() {
    return contents;
}

public void setContents(String contents) {
    this.contents = contents;
}


public String getImage() {
    return image;
}

public void setImage(String image) {
    this.image = image;
}

}

adapter에 넣어줘 메인화면에 띄워줄려고 합니다. adapter부분에서 String image를 디코딩 하는 부분입니다.

PersonAdapter.java 의 setItem부분(BindViewHolder)

public void setItem(Person item){ String data=item.getImage(); Log.d("image",item.getImage()); byte[] byteArray= Base64.decode(data,0);

        ByteArrayInputStream inputStream=new ByteArrayInputStream(byteArray);

        Bitmap bitmap= BitmapFactory.decodeStream(inputStream);
        uploadImage.setImageBitmap(bitmap); //에러나는부분
        userId.setText(item.getUserId());
        title.setText(item.getTitle());
        contents.setText(item.getContents());
    }

E/AndroidRuntime: FATAL EXCEPTION: main Process: com.jungbo.j4android.mynewist, PID: 5549 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setImageBitmap(android.graphics.Bitmap)' on a null object reference at com.jungbo.j4android.mynewist.PersonAdapter$ViewHolder.setItem(PersonAdapter.java:112) at com.jungbo.j4android.mynewist.PersonAdapter.onBindViewHolder(PersonAdapter.java:40) at com.jungbo.j4android.mynewist.PersonAdapter.onBindViewHolder(PersonAdapter.java:22) at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781) at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823) at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752) at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858) at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854) at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230) at android.support.v7.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:557) at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517) at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612) at android.support.v7.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:171) at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924) at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:3336) at android.view.View.measure(View.java:23169) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535) at android.widget.LinearLayout.measureVertical(LinearLayout.java:825) at android.widget.LinearLayout.onMeasure(LinearLayout.java:704) at android.view.View.measure(View.java:23169) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at android.view.View.measure(View.java:23169) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:733) at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:95) at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1556) at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:803) at android.view.View.measure(View.java:23169) at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1119) at android.view.View.measure(View.java:23169) at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461) at android.view.View.measure(View.java:23169) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143) at android.view.View.measure(View.java:23169) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535) at android.widget.LinearLayout.measureVertical(LinearLayout.java:825) at android.widget.LinearLayout.onMeasure(LinearLayout.java:704) at android.view.View.measure(View.java:23169) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at android.view.View.measure(View.java:23169) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) E/AndroidRuntime: at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535) at android.widget.LinearLayout.measureVertical(LinearLayout.java:825) at android.widget.LinearLayout.onMeasure(LinearLayout.java:704) at android.view.View.measure(View.java:23169) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749) at android.widget.FrameLayout.onMeasure(FrameLayout.java:185) at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716) at android.view.View.measure(View.java:23169) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2718) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1572) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1855) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1460) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7183) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:949) at android.view.Choreographer.doCallbacks(Choreographer.java:761) at android.view.Choreographer.doFrame(Choreographer.java:696) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:935) at android.os.Handler.handleCallback(Handler.java:873) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:193) at android.app.ActivityThread.main(ActivityThread.java:6669) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

  • NPE 같은 런타임 오류는 디버거로 오류가 발생할 당시의 변수값들을 확인해봐야 합니다. 더구나 통신 프로그램이면 코드만 제공된다고 해결되는 문제가 아닙니다. 단말기에서 제대로 요청은 하는 것인지 제대로된 요청이라면 서버에서 올바르게 리턴하고 있는지 확인해야 합니다. 사용하는 ide의 디버거를 이용해서 라인단위로 트레이스 하면서 변수값들을 확인하세요. 그 방법밖에 없습니다. 정영훈 2019.12.13 00:30

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)