-
-
Save Antarix/4167655 to your computer and use it in GitHub Desktop.
import java.io.IOException; | |
import java.io.InputStream; | |
import java.net.MalformedURLException; | |
import org.apache.http.HttpResponse; | |
import org.apache.http.client.methods.HttpGet; | |
import org.apache.http.impl.client.DefaultHttpClient; | |
import android.content.Context; | |
import android.graphics.Canvas; | |
import android.graphics.drawable.BitmapDrawable; | |
import android.graphics.drawable.Drawable; | |
import android.os.AsyncTask; | |
import android.text.Html.ImageGetter; | |
import android.view.View; | |
public class UrlImageParser implements ImageGetter { | |
Context c; | |
View container; | |
/*** | |
* Construct the URLImageParser which will execute AsyncTask and refresh the container | |
* @param t | |
* @param c | |
*/ | |
public UrlImageParser(View t, Context c) { | |
this.c = c; | |
this.container = t; | |
} | |
public Drawable getDrawable(String source) { | |
UrlDrawable urlDrawable = new UrlDrawable(); | |
// get the actual source | |
ImageGetterAsyncTask asyncTask = | |
new ImageGetterAsyncTask( urlDrawable); | |
asyncTask.execute(source); | |
// return reference to URLDrawable where I will change with actual image from | |
// the src tag | |
return urlDrawable; | |
} | |
public class ImageGetterAsyncTask extends AsyncTask<String, Void, Drawable> { | |
UrlDrawable urlDrawable; | |
public ImageGetterAsyncTask(UrlDrawable d) { | |
this.urlDrawable = d; | |
} | |
@Override | |
protected Drawable doInBackground(String... params) { | |
String source = params[0]; | |
return fetchDrawable(source); | |
} | |
@Override | |
protected void onPostExecute(Drawable result) { | |
// set the correct bound according to the result from HTTP call | |
urlDrawable.setBounds(0, 0, 0 + result.getIntrinsicWidth(), 0 | |
+ result.getIntrinsicHeight()); | |
// change the reference of the current drawable to the result | |
// from the HTTP call | |
urlDrawable.drawable = result; | |
// redraw the image by invalidating the container | |
UrlImageParser.this.container.invalidate(); | |
} | |
/*** | |
* Get the Drawable from URL | |
* @param urlString | |
* @return | |
*/ | |
public Drawable fetchDrawable(String urlString) { | |
try { | |
InputStream is = fetch(urlString); | |
Drawable drawable = Drawable.createFromStream(is, "src"); | |
drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth(), 0 | |
+ drawable.getIntrinsicHeight()); | |
return drawable; | |
} catch (Exception e) { | |
return null; | |
} | |
} | |
private InputStream fetch(String urlString) throws MalformedURLException, IOException { | |
DefaultHttpClient httpClient = new DefaultHttpClient(); | |
HttpGet request = new HttpGet(urlString); | |
HttpResponse response = httpClient.execute(request); | |
return response.getEntity().getContent(); | |
} | |
} | |
@SuppressWarnings("deprecation") | |
public class UrlDrawable extends BitmapDrawable { | |
// the drawable that you need to set, you could set the initial drawing | |
// with the loading image if you need to | |
protected Drawable drawable; | |
@Override | |
public void draw(Canvas canvas) { | |
// override the draw to facilitate refresh function later | |
if(drawable != null) { | |
drawable.draw(canvas); | |
} | |
} | |
} | |
} |
Hold on to a reference from the textview and try this at the end of the postExecute:
URLImageParser.this.container.invalidate(); //redraw the image by invalidating the container
container.setText(container.getText());
Can anyone post a usage example ?
Thanks
I have a question....can the string which has the URL be retrieved from the web E.g something like MySQL db or be dynamic
Is it possible to get the images from server side instead of placing in drawable folder
Not working for me! Text and image is overlapping.
DefaultHttpClient is deprecated. Try HttpURLConnection on fetch method:
private InputStream fetch(String urlString) throws MalformedURLException, IOException {
URL url = new URL(urlString);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream stream = urlConnection.getInputStream();
return stream;
}
@UmaYalanati and @caman9119
I have the same issue for setting the image below the text and i tried to apply ur given solution that is
URLImageParser.this.container.invalidate(); //redraw the image by invalidating the container
container.setText(container.getText());
but the last line of setting text gives error as this method is not present for that container. Looking for reply ASAP....
if(container instanceof TextView) { ((TextView)container).setText(((TextView)container).getText()); }
thx @Antarix! I've tried it. it works.
Text and Image are overlapping to each other.. Can u Please provide solution....