рдЯреЗрдХреНрд╕реНрдЯ рд╡реНрдпреВ рдореЗрдВ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕рд▓реА рд▓реЛрдб рд╣реЛ рд░рд╣реА рддрд╕реНрд╡реАрд░реЗрдВ

рдпрд╣ рдХреЛрдИ рд░рд╣рд╕реНрдп рдирд╣реАрдВ рд╣реИ рдХрд┐ Android TextView HTML рдЯреИрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдЙрдирдореЗрдВ рд╕реЗ, рдЯреИрдЧ рд╕рдорд░реНрдерд┐рдд рд╣реИ, рдФрд░ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ImageGetter рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдЕрдЧрд░ рд╕реНрдерд╛рдиреАрдп рдЫрд╡рд┐ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЬрдм рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╡реНрдпреВ рдХреЛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ TextView рдореЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ Android рд╕рдВрд╕реНрдХрд░рдг 3.0 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдкрд░ рдПрдХ NetworkOnMainThreadException рдорд┐рд▓рддреА рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рд╣реИ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдЗрдВрдЬрди рдореЗрдВ рдмрд╣реБрдд рдХрдо рдЬрд╛рдирдХрд╛рд░реА рд╣реИ, рдФрд░ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╕реЗ рд╕рднреА рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд╣реИрдВред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдорд╛рдзрд╛рди рдореМрдЬреВрдж рд╣реИред
рдбреНрд░реЙрдЗрдВрдЧ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕рдорд╛рдзрд╛рди TextView рдореЗрдВ рд╕реНрдкреИрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рд╣реИред рд╣рдо рдбрд╛рдЙрдирд▓реЛрдб рдХреА рдЧрдИ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдХреИрд╢ рдХрд░реЗрдВрдЧреЗ рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдкрд░ рдЙрдиреНрд╣реЗрдВ рд▓реЛрдб рди рдХрд░реЗрдВ (рдЖрдкрдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ)ред рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ ImageGetter рдХреЗ рджреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдиреЗ рд╣реЛрдВрдЧреЗ:

static final Map<String, WeakReference<Drawable>> mDrawableCache = Collections.synchronizedMap(new WeakHashMap<String, WeakReference<Drawable>>()); @Override public void onCreate(Bundle savedInstanceState) { //... //  ImageGetter Html.ImageGetter igLoader = new Html.ImageGetter() { public Drawable getDrawable(String source) { //    ,          if (mDrawableCache.containsKey(source)) return mDrawableCache.get(source).get(); //  ,     new ImageDownloadAsyncTask(source, message, messageView).execute(); //      return new BitmapDrawable(getResources()); } }; //     messageView.setText(Html.fromHtml(message, igLoader, null)); } //  ImageGetter. //   ,    Html.ImageGetter igCached = new Html.ImageGetter() { public Drawable getDrawable(String source) { //      if (mDrawableCache.containsKey(source)) return mDrawableCache.get(source).get(); return null; } }; 


рдЕрдм, рд╣рдо рдЕрдкрдиреА рдХрдХреНрд╖рд╛ рдХреЛ AsyncTask рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рд╕реАрдзреЗ рдЪрд┐рддреНрд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдЧреА:

 class ImageDownloadAsyncTask extends AsyncTask<Void, Void, Void> { private String source; private String message; private TextView textView; public ImageDownloadAsyncTask(String source, String message, TextView textView) { this.source = source; this.message = message; this.textView = textView; } @Override protected Void doInBackground(Void... params) { if (!mDrawableCache.containsKey(source)) { try { //     URL url = new URL(source); URLConnection connection = url.openConnection(); InputStream is = connection.getInputStream(); Drawable drawable = Drawable.createFromStream(is, "src"); //  ,    , //       // . /* Bitmap bmp = BitmapFactory.decodeStream(is); DisplayMetrics dm = MainActivity.this.getResources().getDisplayMetrics(); bmp.setDensity(dm.densityDpi); Drawable drawable=new BitmapDrawable(MainActivity.this.getResources(),bmp); */ is.close(); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); mDrawableCache.put(source, new WeakReference<Drawable>( drawable)); } catch (MalformedURLException e) { e.printStackTrace(); } catch (Throwable t) { t.printStackTrace(); } } return null; } @Override protected void onPostExecute(Void result) { //     textView.setText(Html.fromHtml(message, igCached, null)); } } 


рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдореИрдирд┐рдлрд╝реЗрд╕реНрдЯ рдореЗрдВ android.permission.INTERNET рдЕрдиреБрдорддрд┐ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред

рд╕реНрд░реЛрдд / рд╕рдВрдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛

Source: https://habr.com/ru/post/In155879/


All Articles