簡體   English   中英

顯示從HTML到TextView的圖像-Android

[英]Showing images from HTML to TextView - Android

我正在使用AsuncTask從Web服務獲取JSON。 從JSON中,我獲得了“標題”和“全文”。 “標題”是簡單的文本,而“全文”是HTML文本。 在此HTML中,我有一些帶有圖像的文本和URL。 我想在TextView中顯示整個HTML。

我的代碼:

    TextView tvArticleTitle = (TextView) findViewById(R.id.tvArticleTitle);
    TextView tvArticleText = (TextView) findViewById(R.id.tvArticleText);

public class GetArticleTask extends AsyncTask<String, Void, Boolean> {

        private String title;
        private String text;
        private ProgressDialog dialog;

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            dialog = new ProgressDialog(context);
            dialog.setMessage("Please wait!");
            dialog.setCancelable(false);
            dialog.show();
        }

        @Override
        protected Boolean doInBackground(String... params) {

            try {
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(Variables.URL_ARTICLE);
                httpPost.setEntity(new UrlEncodedFormEntity(pair));

                HttpResponse httpResponse = httpClient.execute(httpPost);
                HttpEntity httpEntity = httpResponse.getEntity();
                String data = EntityUtils.toString(httpEntity);

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

                if (status == HttpStatus.SC_OK) {

                    JSONObject jRealObject = new JSONObject(data);

                    title = jRealObject.getString("title").toString();
                    text = jRealObject.getString("fulltext").toString();

                    return true;
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return false;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);

            if (result == false) {
                Toast.makeText(context, Variables.ERROR_MESSAGE, Toast.LENGTH_SHORT).show();
            } else {

                tvArticleTitle.setText(title);
                tvArticleText.setText(Html.fromHtml(text, new ImageGetter() {

                    @Override
                    public Drawable getDrawable(String source) {

                        Drawable drawable = null;
                        URL sourceURL;

                        try {
                            sourceURL = new URL(source);
                            URLConnection urlConnection = sourceURL.openConnection();
                            urlConnection.connect();
                            InputStream inputStream = urlConnection.getInputStream();
                            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
                            Bitmap bm = BitmapFactory.decodeStream(bufferedInputStream);

                            // convert Bitmap to Drawable
                            drawable = new BitmapDrawable(getResources(), bm);

                            drawable.setBounds(0, 0, bm.getWidth(), bm.getHeight());
                        } catch (MalformedURLException e) {
                            e.printStackTrace();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }

                        return drawable;
                    }

                }, null));

                if(dialog.isShowing()) {
                    dialog.dismiss();
                }
            }
        }
    }
}

它給我錯誤:android.os.NetworkOnMainThreadException。 我知道我需要再次在AsyncTask上進行此操作,但是我不知道如何拆分代碼。

如果您的json有點像這樣:

 { "text": "some text", "html1": "Hi, check out my fb profile picture at <img src = 'http:\\/\\/abc.com/image1.png'\\/> ", "html2": "Hi, check out my whatsapp profile picture at <img src = 'http:\\/\\/abc.com\\/image1.png'\\/> ", . . . } 
然后 :
 public class MainActivity extends Activity implements ImageGetter { private final static String TAG = "MainActivity"; private TextView mTv; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String source = <your source from json here>; Spanned spanned = Html.fromHtml(source, this, null); mTv = (TextView) findViewById(R.id.text); mTv.setText(spanned); } @Override public Drawable getDrawable(String source) { LevelListDrawable d = new LevelListDrawable(); Drawable empty = getResources().getDrawable(R.drawable.ic_launcher); d.addLevel(0, 0, empty); d.setBounds(0, 0, empty.getIntrinsicWidth(), empty.getIntrinsicHeight()); new LoadImage().execute(source, d); return d; } class LoadImage extends AsyncTask<Object, Void, Bitmap> { private LevelListDrawable mDrawable; @Override protected Bitmap doInBackground(Object... params) { String source = (String) params[0]; mDrawable = (LevelListDrawable) params[1]; Log.d(TAG, "doInBackground " + source); try { InputStream is = new URL(source).openStream(); return BitmapFactory.decodeStream(is); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(Bitmap bitmap) { Log.d(TAG, "onPostExecute drawable " + mDrawable); Log.d(TAG, "onPostExecute bitmap " + bitmap); if (bitmap != null) { BitmapDrawable d = new BitmapDrawable(bitmap); mDrawable.addLevel(1, 1, d); mDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight()); mDrawable.setLevel(1); // i don't know yet a better way to refresh TextView // mTv.invalidate() doesn't work as expected CharSequence t = mTv.getText(); mTv.setText(t); } } } } 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM