2014-09-30 66 views
0

我正在使用AsuncTask从Web服务获取JSON。从JSON我得到“标题”和“全文”。 “标题”是简单的文本,但“全文”是HTML文本。在这个HTML中,我有一些文字和网址与图像。我想在TextView中显示整个HTML。显示从HTML到TextView的图像 - Android

我的代码:

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上做这件事,但我不知道如何分割代码。

+0

你应该使用图像跨度来显示图像(在这之前,你需要下载图像太) – MHP 2014-09-30 13:10:39

+0

我认为使用picasa图像库更容易加载该映像,因为它几乎可以处理您制作的所有内容盟友需要担心abou ..我建议你去picasa图像加载器库 – 2014-09-30 13:12:03

+0

@GeorgeThomas是啊。在文本是整个HTML,从那里我想显示所有图像,也是文字。 – KiKo 2014-09-30 13:15:31

回答

0

如果你的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); 
 
      } 
 
     } 
 
    } 
 
}