2016-03-24 14 views
1

リサイクラービューでユーザーの詳細を表示しようとしています。AndroidでjsonのURLから画像をダウンロードして表示する

私の画像を表示しようとすると動作しません。私はすべての可能性を試しました。以下は私のアダプタクラスです。

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{ 
    private LinkedList<HashMap<String, Object>> myDataSet; 
    Bitmap bitmap; 
    MyAdapter.ViewHolder viewHolder; 
    String image; 

public MyAdapter(LinkedList<HashMap<String, Object>> values) { 
    myDataSet = values; 
} 

public class ViewHolder extends RecyclerView.ViewHolder{ 

    public TextView userIdView; 
    public TextView jobTitleNameView; 
    public TextView employeeCodeView; 
    public ImageView imageView; 

    public ViewHolder(View itemView) { 
     super(itemView); 
     userIdView = (TextView)itemView.findViewById(R.id.userId); 
     jobTitleNameView = (TextView)itemView.findViewById(R.id.jobTitleName); 
     employeeCodeView = (TextView)itemView.findViewById(R.id.employeeCode); 
    } 
} 

@Override 
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = LayoutInflater.from(
      parent.getContext()); 
    View v = inflater.inflate(R.layout.activity_listview, parent, false); 
    viewHolder = new ViewHolder(v); 
    return viewHolder; 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, final int position) { 
    final HashMap<String, Object> userDetails = myDataSet.get(position); 
    String userId = (String) userDetails.get("userId"); 
    String jobTitleName = (String) userDetails.get("jobTitleName"); 
    String employeeCode = String.valueOf(userDetails.get("employeeCode")); 
    image = (String) userDetails.get("image"); 

    ImageDownloader imageDownloader = new ImageDownloader(); 
    imageDownloader.execute(viewHolder); 


    holder.userIdView.setText(userId); 
    holder.jobTitleNameView.setText(jobTitleName); 
    holder.employeeCodeView.setText(employeeCode); 
} 

@Override 
public int getItemCount() { 
    return myDataSet.size(); 
} 

これはイメージをダウンロードするためにこのクラスの内部に書き込まれるクラスです。

private class ImageDownloader extends AsyncTask<ViewHolder,ViewHolder,ViewHolder>{ 

    @Override 
    protected ViewHolder doInBackground(ViewHolder... params) { 
     viewHolder = params[0]; 

     URL url = null; 
     try { 
      url = new URL(image); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoInput(true); 
      connection.connect(); 
      InputStream inputStream = connection.getInputStream(); 
      bitmap = BitmapFactory.decodeStream(inputStream); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return viewHolder; 
    } 

    @Override 
    protected void onPostExecute(ViewHolder result){ 
     viewHolder.imageView.setImageBitmap(bitmap); 
    } 
    } 
} 

そのない直接的な解決策は、私はピカソやグライドのようなライブラリを使用することをお勧めします可能性がありますが、誰かが

03-24 16:27:48.421 19806-20764/com.example.rini.listviewandroid W/System.err: java.net.ConnectException: failed to connect to www.scri8e.com/208.87.227.250 (port 80): connect failed: ETIMEDOUT (Connection timed out) 
    03-24 16:27:48.421 19806-20764/com.example.rini.listviewandroid W/System.err:  at libcore.io.IoBridge.connect(IoBridge.java:124) 
    03-24 16:27:48.421 19806-20764/com.example.rini.listviewandroid W/System.err:  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:183) 
    03-24 16:27:48.421 19806-20764/com.example.rini.listviewandroid W/System.err:  at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:456) 
    03-24 16:27:48.421 19806-20764/com.example.rini.listviewandroid W/System.err:  at java.net.Socket.connect(Socket.java:882) 
    03-24 16:27:48.421 19806-20764/com.example.rini.listviewandroid W/System.err:  at com.android.okhttp.internal.Platform.connectSocket(Platform.java:174) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at com.android.okhttp.Connection.connect(Connection.java:152) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:276) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:211) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.execute(HttpURLConnectionImpl.java:382) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at com.android.okhttp.internal.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:106) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at com.example.rini.listviewandroid.MyAdapter$ImageDownloader.doInBackground(MyAdapter.java:94) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at com.example.rini.listviewandroid.MyAdapter$ImageDownloader.doInBackground(MyAdapter.java:77) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at android.os.AsyncTask$2.call(AsyncTask.java:292) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at java.lang.Thread.run(Thread.java:818) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err: Caused by: android.system.ErrnoException: connect failed: ETIMEDOUT (Connection timed out) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at libcore.io.Posix.connect(Native Method) 
    03-24 16:27:48.422 19806-20764/com.example.rini.listviewandroid W/System.err:  at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:111) 
    03-24 16:27:48.423 19806-20764/com.example.rini.listviewandroid W/System.err:  at libcore.io.IoBridge.connectErrno(IoBridge.java:137) 
    03-24 16:27:48.423 19806-20764/com.example.rini.listviewandroid W/System.err:  at libcore.io.IoBridge.connect(IoBridge.java:122) 
    03-24 16:27:48.423 19806-20764/com.example.rini.listviewandroid W/System.err: ... 17 more 
+0

グライド!これは、多くの機能を内蔵しており、メモリリーク、キャッシング、画像のダウンロードなど多くの苦痛を軽減します。あなたが特別な解決策を必要としない限り、私はそれを使用します。 –

答えて

1

以下のログを見つけてください....これで私を助けることができますか?コードを劇的に削減します。 http://square.github.io/picasso/ グライド:https://futurestud.io/blog/glide-getting-started

あなたonBindViewHolderは、このようなImageDownloaderを変更してみてください。この

@Override 
public void onBindViewHolder(ViewHolder holder, final int position) { 
    final HashMap<String, Object> userDetails = myDataSet.get(position); 
    String userId = (String) userDetails.get("userId"); 
    String jobTitleName = (String) userDetails.get("jobTitleName"); 
    String employeeCode =  String.valueOf(userDetails.get("employeeCode")); 
    image = (String) userDetails.get("image"); 

    //With Picasso 
    Picasso.with(context).load(image).into(viewHolder.imageView); 

    //With Glide 
    Glide.with(context).with(context).load(image).into(viewHolder.imageView) 

    holder.userIdView.setText(userId); 
    holder.jobTitleNameView.setText(jobTitleName); 
    holder.employeeCodeView.setText(employeeCode); 

}

+0

これらのライブラリがなければできませんか? – RStack

+0

いいえ、私はちょうどあなたがコードを減らすことができるようにこれらのライブラリを示唆している+彼らはあなたが画像でより多くを行うことができます。私はその答えではないと言ったように、それはちょうど示唆に過ぎませんでした。私はコメントとしてそれを入れていましたが、コードをどれだけ減らすことができるかを示すコード例を提供したかっただけです。 –

0

ようになります。ここライブラリ

ピカソへのリンクです。私は確信していませんが、うまくいくはずです。アダプタに比べ

private class ImageDownloader extends AsyncTask<Void,Void,Bitmap> { 
    private ViewHolder viewHolder; 
    private String image; 

    public ImageDownloader(ViewHolder viewHolder, String image) { 
     this.viewHolder = viewHolder; 
     this.image = image; 
    } 

    @Override 
    protected Bitmap doInBackground(Void... params) { 

     URL url = null; 
     try { 
      url = new URL(image); 
      HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoInput(true); 
      connection.connect(); 
      InputStream inputStream = connection.getInputStream(); 
      return BitmapFactory.decodeStream(inputStream); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return null; 
    } 

    @Override 
    protected void onPostExecute(Bitmap bitmap){ 
     if(bitmap != null) { 
      viewHolder.imageView.setImageBitmap(bitmap); 
     } 
    } 
} 

:このようにビットマップをデコードするという問題が発生する可能性があります

ImageDownloader imageDownloader = new ImageDownloader(viewHolder, image); 
imageDownloader.execute(); 
+0

私はこの例外を取得しています。java.net.ConnectException:www.scri8e.com/208.87.227.250(ポート80)への接続に失敗しました:接続に失敗しました:ETIMEDOUT(接続タイムアウト) ' – RStack

+0

イメージURLを記録しましたか?正しい? –

+0

はいいいえ – RStack

0

:いくつかのバイトが間違っている場合

bitmap = BitmapFactory.decodeStream(inputStream); 

、結果はnullを返します。

あなたは以下のように試すことができます:

private static Bitmap urlFetch(Context context, String url) { 
    try { 
     URL u = new URL(url); 
     HttpURLConnection conn = (HttpURLConnection) u.openConnection(); 
     int rspCode = conn.getResponseCode(); 
     if (rspCode != 200) { 
      return null; 
     } 
     InputStream inputStream = null; 
     inputStream = conn.getInputStream(); 
     long total = conn.getContentLength(); 
     try { 
      return BitmapFactory.decodeStream(new FlushedInputStream(
         inputStream)); 
     } finally { 
      if (inputStream != null) { 
       inputStream.close(); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
} 


static class FlushedInputStream extends FilterInputStream { 
    public FlushedInputStream(InputStream inputStream) { 
     super(inputStream); 
    } 

    @Override 
    public long skip(long n) throws IOException { 
     long totalBytesSkipped = 0L; 
     while (totalBytesSkipped < n) { 
      long bytesSkipped = in.skip(n - totalBytesSkipped); 
      if (bytesSkipped == 0L) { 
       int b = read(); 
       if (b < 0) { 
        break; // we reached EOF 
       } else { 
        bytesSkipped = 1; // we read one byte 
       } 
      } 
      totalBytesSkipped += bytesSkipped; 
     } 
     return totalBytesSkipped; 
    } 
} 

基本的にはすべてのビットマップが間違っていた防ぐために間違ったバイトをスキップします。ところで

Imageloaderは複雑な方法であり、あなたが劣化することなく、同時に複数の画像をdownlaoding、メモリを消費(取扱ビットマップがOOMを引き起こすことは本当に簡単です)、キャッシュを考慮し、fileまたはlrucacheとしてビットマップを再利用する必要がありますUX(スレッドプール)なので、サードパーティライブラリを使用してこのジョブを処理することをお勧めします。 Universe-image-loaderは良い選択です。

0

ここはPicasso libraryです。これはあなたが探しているものを意味しています。長い間、非常にカスタマイズ可能なのでこれを使っています。ネットワークやストレージから高速に読み込むためにイメージをキャッシュすることもできます。そのように簡単です。

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

関連する問題