当前位置: 动力学知识库 > 问答 > 编程问答 >

android - Download images from remote URLs

问题描述:

Currently I am developing an Android app containing a list view which displays links for Youtube videos. The application gets its data from the server as JSON. Now I am trying to display thumbnails for these video from this subdomain - http://img.youtube.com/vi/.

But the images don't show up in the list view.

Here is the code for the project :

1 - canticlesActivity.java

package com.shadatv.shada;

import java.io.File;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.ArrayList;

import java.util.HashMap;

import org.apache.http.HttpEntity;

import org.apache.http.HttpResponse;

import org.apache.http.client.ClientProtocolException;

import org.apache.http.client.HttpClient;

import org.apache.http.client.methods.HttpGet;

import org.apache.http.impl.client.DefaultHttpClient;

import org.apache.http.util.EntityUtils;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

import android.app.ListActivity;

import android.os.AsyncTask;

import android.os.Bundle;

import android.os.Environment;

import android.util.Log;

import android.widget.ListAdapter;

import android.widget.SimpleAdapter;

import android.widget.TextView;

import android.widget.Toast;

public class canticlesActivity extends ListActivity {

TextView httpStuff;

HttpClient client;

JSONArray canticles;

String picpath = "http://img.youtube.com/vi/";

File sdcard = Environment.getExternalStorageDirectory();

File shadaRoot = new File(sdcard.getAbsolutePath() + "/shada_Folder");

private static final String CA_NAME = "ca_name";

private static final String CA_LINK = "ca_link";

private static final String CA_IMG = "ca_img";

private static final String URL = "http://dt-works.com/ags/shadatv/canticles/android_data";

ArrayList<HashMap<String, String>> canticlesList;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.canticles);

httpStuff = (TextView) findViewById(R.id.textView1);

client = new DefaultHttpClient();

new Read().execute();

}

public JSONArray allCanticles() throws ClientProtocolException, IOException, JSONException {

StringBuilder url = new StringBuilder(URL);

HttpGet get = new HttpGet(url.toString());

HttpResponse r = client.execute(get);

int status = r.getStatusLine().getStatusCode();

if (status == 200) {

HttpEntity e = r.getEntity();

String data = EntityUtils.toString(e);

JSONArray canticles = new JSONArray(data);

return canticles;

} else {

Toast.makeText(getBaseContext(), "error", Toast.LENGTH_SHORT).show();

return null;

}

}

public void downloadImage(String fileURL) {

try {

// Toast.makeText(getBaseContext(), "baaad", Toast.LENGTH_SHORT).show();

String finlpth = "";

finlpth = picpath + fileURL + "/2.jpg";

shadaRoot.mkdirs();

URL u = new URL(finlpth);

HttpURLConnection c = (HttpURLConnection) u.openConnection();

c.setRequestMethod("GET");

c.setDoOutput(true);

c.connect();

File DownloadedFile = new File(shadaRoot, fileURL + ".jpg");

// if(!outfile.exists())

FileOutputStream f = new FileOutputStream(DownloadedFile);

InputStream in = c.getInputStream();

byte[] buffer = new byte[1024];

int len1 = 0;

while ((len1 = in.read(buffer)) > 0) {

f.write(buffer, 0, len1);

}

f.close();

} catch (Exception e) {

Log.d("Downloader", e.getMessage());

}

}

public class Read extends AsyncTask<String, String, String>{

@Override

protected String doInBackground(String... params) {

canticlesList = new ArrayList<HashMap<String, String>>();

try {

canticles = allCanticles();

for (int i = 0; i < canticles.length(); i++) {

JSONObject canticle = canticles.getJSONObject(i);

String ca_name = canticle.getString(CA_NAME);

String ca_link = canticle.getString(CA_LINK);

downloadImage(ca_link);

HashMap<String, String> map = new HashMap<String, String>();

map.put(CA_NAME, ca_name);

map.put(CA_LINK, ca_link);

map.put(CA_IMG, ca_link + ".jpg");

canticlesList.add(map);

}

} catch (ClientProtocolException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} catch (JSONException e) {

e.printStackTrace();

}

return null;

}

@Override

protected void onPostExecute(String result) {

ListAdapter adapter = new SimpleAdapter(canticlesActivity.this,

canticlesList,R.layout.list_item,

new String[] {CA_NAME, CA_LINK, CA_IMG},

new int[] {R.id.ca_name, R.id.ca_link, R.id.ca_img});

setListAdapter(adapter);

}

}

}

2 - list_item.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:background="@drawable/list_selector"

android:orientation="horizontal" >

<!-- Product id (pid) - will be HIDDEN - used to pass to other activity -->

<ImageView

android:id="@+id/ca_img"

android:layout_width="50dip"

android:layout_height="50dip"

android:contentDescription="@string/desc"

/>

<TextView

android:id="@+id/ca_name"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

/>

<!-- Name Label -->

<TextView

android:id="@+id/ca_link"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:paddingTop="6dip"

android:paddingLeft="6dip"

android:textSize="17sp"

android:textStyle="bold"

android:visibility="gone" />

</LinearLayout>

网友答案:

You can use UniversalImageLoader it very simple for using -imageLoader.displayImage(imageUri, imageView);

网友答案:

Downloading images and then displaying in ListView is bad process. Because just think if you are having >100 images then it will take more time to display it.

And now optimization which i would suggest is: Implement logic for lazy loading of Images inside ListView.

Refer below examples:

  1. Lazy List by Fedor
  2. Universal Image Loader
  3. ImageLoader by Novoda
网友答案:

In youtube JSON data ,The entire videos information will be in "entry" JSON array. You are creating same tag name for all the entires in the Hashmap.. If you give same tag for all entries then it will display last entry image. Please change the TAG NAME to "map.put(CA_IMG+i, ca_link + ".jpg");" I hope this solution will be helpful for you.

分享给朋友:
您可能感兴趣的文章:
随机阅读: