2016-03-24 6 views
1

Ich versuche, Benutzerdetails in Recycling-Ansicht anzuzeigen.Herunterladen und Anzeigen von Bild von URL in JSON in Android

Wenn ich versuche, mein Bild anzuzeigen, funktioniert es nicht. Ich habe alle Möglichkeiten ausprobiert. Folgendes ist meine Adapterklasse.

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(); 
} 

Dies ist die in dieser Klasse für das Herunterladen von Bildern geschriebene Klasse.

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); 
    } 
    } 
} 

jemand mir dabei helfen kann ....

Bitte das Protokoll unter

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

Ich empfehle sehr Glide! Es ist mit vielen Funktionen ausgestattet und spart Ihnen viel Schmerz (Speicherlecks, Caching, Download des Bildes).Solange Sie keine spezielle Lösung benötigen, würde ich es verwenden. –

Antwort

1

finden Während seine keine direkte Lösung könnte ich eine Bibliothek wie Picasso mit empfehlen und Glide? Es wird den Code drastisch reduzieren. Hier sind einige Links zu den Bibliotheken

Picasso: http://square.github.io/picasso/ Glide: https://futurestud.io/blog/glide-getting-started

Ihre onBindViewHolder dann so etwas wie dieses

@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

Ist es nicht möglich ohne diese Bibliotheken? – RStack

+0

Nein, es ist möglich, ich schlage nur diese Bibliotheken vor, damit Sie den Code reduzieren können + sie ermöglichen es Ihnen, mehr mit den Bildern zu tun. Wie ich schon sagte, es ist keine Antwort, es war nur ein Vorschlag. Ich hätte es als einen Kommentar gesetzt, aber ich wollte Ihnen nur ein Codebeispiel geben, um Ihnen zu zeigen, wie sehr es den Code runter schneiden kann. –

0

aussehen würde versuchen ImageDownloader wie diese ändern. Ich bin mir nicht sicher, aber es sollte funktionieren.

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); 
     } 
    } 
} 

als in-Adapter:

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

Ich erhalte diese Ausnahme 'java.net.ConnectException: Verbindung zu www.scri8e.com/208.87.227.250 fehlgeschlagen (Port 80): Verbindung fehlgeschlagen: ETIMEDOUT (Zeitüberschreitung der Verbindung)' – RStack

+0

Haben Sie Bild-URL protokolliert, ist es richtig? –

+0

ja es ist korrekt – RStack

0

Es könnte Probleme verursachen Bitmap wie folgt zu entschlüsseln:

bitmap = BitmapFactory.decodeStream(inputStream); 

wenn einige Bytes falsch sind, kehrt das Ergebnis null.

Sie mögen unten versuchen:

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; 
    } 
} 

Grundsätzlich wird es falsch Byte überspringen alle Bitmap zu verhindern, ging schief.

By the way, Imageloader ist ein komplexes Verfahren, müssen Sie Speicher aufwändig (Umgang mit Bitmap ist wirklich einfach zu verursachen OOM), Cache und wieder verwenden die Bitmap als file oder lrucache, downlaoding mehrere Bilder gleichzeitig zu prüfen, ohne eine Verschlechterung die UX (Thread-Pool), so empfehle ich Ihnen, eine Drittanbieter-Bibliothek zu verwenden, um diesen Job zu behandeln. Universe-image-loader ist eine gute Wahl.

0

Hier ist eine Picasso library .xactly gemeint für das, was Sie suchen. Ich habe diese seit langem, sehr custom-able.Sie können auch wählen, entweder die Bilder für das schnellere Laden aus dem Netzwerk oder aus dem Speicher zwischenspeichern so einfach wie das

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

Verwandte Themen