Async ImageGetter не работает должным образом - PullRequest
0 голосов
/ 12 октября 2011

Я пытался загружать встроенные изображения из html асинхронно, следуя информации в этой теме: Android HTML ImageGetter as AsyncTask

Я мог заставить изображения загружаться нормально.НО!

Вот как это заканчивается:

enter image description here

Вот как это должно выглядеть и как это выглядит, если я не загружаю их асинхронно:

enter image description here

Есть идеи, как это можно исправить?Заранее спасибо.

РЕДАКТИРОВАТЬ:

Код для моего URLImageParser:

public URLImageParser( View t, Context c )
{
    this.c = c;
    this.container = t;
}

public Drawable getDrawable( String source )
{
    URLDrawable urlDrawable = new URLDrawable();

    ImageGetterAsyncTask asyncTask = new ImageGetterAsyncTask( urlDrawable );

    asyncTask.execute( source );

    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 )
    {
        urlDrawable.setBounds( 0, 0, 0 + result.getIntrinsicWidth(), 0
                + result.getIntrinsicHeight() );

        urlDrawable.drawable = result;

        URLImageParser.this.container.invalidate();
    }

    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 Exception
    {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet request = new HttpGet( urlString );
        HttpResponse response = httpClient.execute( request );
        return response.getEntity().getContent();
    }
}

И код для URLDrawable

@Override
public void draw( Canvas canvas )
{
    if( drawable != null )
    {
        drawable.draw( canvas );
    }
}

1 Ответ

1 голос
/ 28 августа 2012

Я нашел решение этой проблемы.Вы должны сохранить ссылку на экземпляр TextView, и после загрузки изображения вы должны вызвать setText с тем же текстом в вашем методе onPostExecute:

@Override
protected void onPostExecute( Drawable result )
{
    urlDrawable.setBounds( 0, 0, 0 + result.getIntrinsicWidth(), 0
            + result.getIntrinsicHeight() );

    urlDrawable.drawable = result;

    // mTextView is the reference to the TextView instance
    mTextView.setText(mTextView.getText());
}

Это заставит TextView изменить макет своего содержимого.

...