【问题标题】:Load images in Html.fromHtml in textview (JSON String)在 textview 中加载 Html.fromHtml 中的图像(JSON 字符串)
【发布时间】:2016-05-29 13:31:16
【问题描述】:

我在使用 JSON 字符串解析将图像从网站加载到 TextView 时遇到问题。我试图在 Html.ImageGetter 和 BitmapDrawable 的帮助下加载图像。我看到了这些引用 Load images in Html.fromHtml in textview (http url images, Base64 url images)Android HTML ImageGetter as AsyncTask

我不明白为什么会出现空指针异常。 我正在尝试从 http://techmasi.com/wp-json/posts 这个 JSON 链接加载“内容”字符串。

这是我的代码

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

这是另一个类:

public class URLImageParser implements Html.ImageGetter {
Context context;
TextView container;

public URLImageParser(TextView t, Context c) {
    this.context = 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
        Log.d("height", "" + result.getIntrinsicHeight());
        Log.d("width",""+result.getIntrinsicWidth());
        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();
        // For ICS
        URLImageParser.this.container.setHeight((URLImageParser.this.container.getHeight()
                + result.getIntrinsicHeight()));
        // Pre ICS
        URLImageParser.this.container.setEllipsize(null);
    }
}


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

我在以下行中收到 NullPointer 异常:

urlDrawable.setBounds(0, 0, 0+result.getIntrinsicWidth(), 0+result.getIntrinsicHeight());

Logcat 输出:

java.lang.NullPointerException
        at com.droiddigger.techmasi.URLImageParser$ImageGetterAsyncTask.onPostExecute(URLImageParser.java:64)
        at com.droiddigger.techmasi.URLImageParser$ImageGetterAsyncTask.onPostExecute(URLImageParser.java:48)
        at android.os.AsyncTask.finish(AsyncTask.java:631)
        at android.os.AsyncTask.access$600(AsyncTask.java:177)
        at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:137)
        at android.app.ActivityThread.main(ActivityThread.java:5103)
        at java.lang.reflect.Method.invokeNative(Native Method)
        at java.lang.reflect.Method.invoke(Method.java:525)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
        at dalvik.system.NativeStart.main(Native Method)

请帮忙。 提前致谢。

【问题讨论】:

    标签: android json image-load


    【解决方案1】:

    我建议不要使用 Drawable.createFromStream()。它基本上没有记录和doesn't do what you need。我敢打赌它会返回 null。

    如果您需要从包含 PNG、JPG、GIF 或其他 Android 支持的图像类型的 InputStream 中解码位图,请尝试 BitmapFactory.decodeStream(),然后从该位图创建一个 Drawable。

    【讨论】:

    • 您是否尝试过通过调试会话逐步运行它?说“不工作”并不能真正帮助我们了解问题所在。
    • 很抱歉,但我不明白调试会话的步骤,因为我是 android 的初学者。我刚刚在 fetchDrawable Method InputStream is = fetch(urlString); Bitmap btmp = BitmapFactory.decodeStream(is); Drawable drawable=new BitmapDrawable(Resources.getSystem(),btmp); drawable.setBounds(0, 0, 0 + drawable.getIntrinsicWidth(), 0 + drawable.getIntrinsicHeight()); return drawable; 中做了如下改动
    • 谷歌“在 Android 中调试”。
    猜你喜欢
    • 1970-01-01
    • 2014-05-21
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 2017-06-21
    • 2013-04-30
    相关资源
    最近更新 更多