2016-08-18 4 views
0

ImageView와 TextView가 포함 된 ListView를 사용했습니다. 나는 서버에서 이미지를 얻고 싶다. 나는 이미지를 성공적으로 얻을 수 있다고 말한 아래의 코드를 디버깅하지만, 돌아 왔을 때, 이미지는 사라졌다. 나는 이유를 모른다. 나는 안드로이드의 새로운 시작 자다. 누군가가 나를 도울 수 있기를 바랍니다.Android : 서버에서 이미지를 얻으려면

목록보기 어댑터 클래스 :

public View getView(int position, View convertView, ViewGroup parent) { 
    News news = getItem(position); 
    View view = LayoutInflater.from(getContext()).inflate(resourceId, null); 
    newsImage = (ImageView) view.findViewById(R.id.news_image); 
    newsTitle = (TextView) view.findViewById(R.id.news_title); 

    newsTitle.setText(news.getTitle()); 
    bitmap = HttpUtil.sendImageRequest(news.getImageUrl()); 
    newsImage.setImageBitmap(ImageUtility.ImageSolution(bitmap, newsImage)); 
    return view; 
} 

sendImageRequest 방법 :

public static Bitmap sendImageRequest(final String address){ 
    final Bitmap[] bitmap = new Bitmap[1]; 
    new Thread(new Runnable() { 
     @Override 
     public void run() { 
      HttpURLConnection connection = null; 
      try { 
       connection = (HttpURLConnection) new URL(address).openConnection(); 
       connection.setRequestMethod("GET"); 
       connection.setDoInput(true); 

       InputStream in = connection.getInputStream(); 
       bitmap[0] = BitmapFactory.decodeStream(in); 
      } catch (java.io.IOException e) { 
       e.printStackTrace(); 
      } finally { 
       if (connection != null){ 
        connection.disconnect(); 
       } 
      } 
     } 
    }).start(); 
    return bitmap[0]; 
} 

ImageSolution 방법 :

public static Bitmap ImageSolution (Bitmap bitmap, ImageView imageView){ 
    int width = bitmap.getWidth(); 
    int height = bitmap.getHeight(); 
    int newWidth = imageView.getWidth(); 
    int newHeight = imageView.getHeight(); 

    float scaleWidth = ((float) newWidth)/width; 
    float scaleHeight = ((float) newHeight)/height; 

    Matrix matrix = new Matrix(); 
    matrix.postScale(scaleWidth, scaleHeight); 

    Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, 
      height, matrix, true); 
    return resizedBitmap; 
} 

주소가 http://p2.zhimg.com/10/7b/107bb4894b46d75a892da6fa80ef504a.jpg입니다.

정말 고마워요.

답변

0
bitmap = HttpUtil.sendImageRequest(news.getImageUrl()); 

비트 맵 이미지 요청이므로 항상 비어 있습니다. 이 함수는 스레드를 시작하지만 즉시 리턴합니다. 따라서 빈 비트 맵을 반환합니다.

newsImage.setImageBitmap(ImageUtility.ImageSolution(bitmap, newsImage)); 

그런 다음 비어있는 비트 맵을 imageview로 설정하려고하면 문제가 발생합니다.

앱을 다시 디자인하십시오. 스레드가 완료 될 때만 유효한 비트 맵이 있습니다. 그리고 나서 그것을 사용할 수 있습니다.

+0

나는 그것에 대해 많이 모른다.따라서 비트 맵을 반환하려면 어떻게해야합니까? AsyncTask를 사용하여 서버에서 비트 맵을 가져온 다음 UI를 새로 고칠 수 있습니까? AsyncTask 클래스는 어디에 두어야합니까? –

+0

가장 쉬운 해결책은 runOnUIThread를 사용하여 비트 맵을 이미지 뷰에 배치하는 것입니다. 비트 맵이있을 때 스레드의 run()에서이를 수행하십시오. 마지막 성명서. – greenapps

+0

정말 고마워요. 나는 그 문제를 해결했다. 나는 HttpCallbackListener를 사용했다. –

0

Picasso 라이브러리를 사용하지 않는 이유는 무엇입니까?

Picasso.with(context).load(news.getImageUrl()).into(newsImage); 

를 사용하기 정말 쉽게 그리고 캐싱 및 이미지 변환을 제공합니다.

1

Google에서 권장하는 Glide이라는 타사 라이브러리를 사용할 수 있습니다. 이 라이브러리를 추가하려면 모듈 app의 build.gradle 파일에 다음 종속성을 추가하십시오.

private static class ViewHolder { 
    public TextView newsTitle = null; 
    public ImageView newsImage = null; 
} 

다음과 같은 당신의 getView를 코딩

dependencies { 
    compile 'com.github.bumptech.glide:glide:3.5.2' 
    compile 'com.android.support:support-v4:22.0.0' 
} 

그리고 당신은 단순히

Glide.with(context) 
    .load(news.getImageUrl()) 
    .into(newsImage); 
0

는 어댑터 클래스 내부 viewHolder 클래스를 확인 방법을 다음에 이미지를로드 할 수 있습니다,

public View getView(final int position, View convertView, ViewGroup parent) { 

    final ViewHolder itemHolder; 
    View view = convertView; 
    if (view == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     itemHolder = new ViewHolder(); 
     view = inflater.inflate(layoutResID, parent, false); 

     itemHolder.newsImage = (ImageView) view.findViewById(R.id.news_image); 
     itemHolder.newsTitle = (TextView) view.findViewById(R.id.news_title); 


     view.setTag(itemHolder); 
    } else { 
     itemHolder = (viewHolder) view.getTag(); 
    } 

    News news = getItem(position); 

    itemHolder.newsTitle.setText(news.getTitle()); 
    bitmap = HttpUtil.sendImageRequest(news.getImageUrl()); 
    itemHolder.newsImage.setImageBitmap(ImageUtility.ImageSolution(bitmap, newsImage)); 


    return view; 
} 

또는 전자 피카소,

, 종속 내부에이 줄을 추가 ... 사용하기 쉬운

compile 'com.squareup.picasso:picasso:2.5.0' 

하고있을 것이다 로딩 이미지 로딩 이미지 코드

,

Picasso.with(context).load(news.getImageUrl()).into(itemHolder.newsImage); 
+0

뷰 소유자. 비트 맵이 비어 있습니다. 문제를 해결하지 못했습니다. – greenapps

관련 문제