{"id":122,"date":"2023-02-18T10:59:00","date_gmt":"2023-02-18T02:59:00","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=122"},"modified":"2023-02-18T11:00:03","modified_gmt":"2023-02-18T03:00:03","slug":"android-integrate-imagegetter","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/02\/18\/android-integrate-imagegetter\/","title":{"rendered":"Android\u5c01\u88c5ImageGetter\u63a5\u53e3"},"content":{"rendered":"<p><code>Html.ImageGetter<\/code>\u63a5\u53e3\u5b9e\u73b0\u7c7b<code>NetworkImageGetter<\/code>\uff1a<\/p>\n<p><!-- more --><\/p>\n<pre><code class=\"language-java\">public final class NetworkImageGetter implements Html.ImageGetter {\n\n    private static final String TAG = &quot;yezhou&quot;;\n\n    private Context context;\n    private NetworkImageAsyncLoader loader;\n\n    public NetworkImageGetter(Context context, NetworkImageAsyncLoader loader) {\n        this.context = context;\n        this.loader = loader;\n    }\n\n    @Override\n    public Drawable getDrawable(String source) {\n        Drawable drawable = null;\n        \/\/ \u5c01\u88c5\u8def\u5f84\n        Log.i(TAG, &quot;source: &quot; + source);\n        String imageName = source.substring(source.lastIndexOf(&#039;\/&#039;) + 1);\n        Log.i(TAG, &quot;imageName: &quot; + imageName);\n        File file = new File(EnvironmentUtil.getInstance().getRootDirectory(), &quot;\/images\/&quot; + imageName);\n        \/\/ \u5224\u65ad\u662f\u5426\u4ee5http\u5f00\u5934\n        if (source.startsWith(&quot;http&quot;)) {\n            \/\/ \u5224\u65ad\u8def\u5f84\u662f\u5426\u5b58\u5728\n            if (file.exists()) {\n                \/\/ \u5b58\u5728\u5373\u83b7\u53d6drawable\n                drawable = Drawable.createFromPath(file.getAbsolutePath());\n                int dpWidth = drawable.getIntrinsicWidth();\n                int dpHeight = drawable.getIntrinsicHeight();\n                int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpWidth, context.getResources().getDisplayMetrics());\n                int heigth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpHeight, context.getResources().getDisplayMetrics());\n                drawable.setBounds(0, 0, width, heigth);\n            } else {\n                \/\/ \u4e0d\u5b58\u5728\u5373\u5f00\u542f\u5f02\u6b65\u4efb\u52a1\u52a0\u8f7d\u7f51\u7edc\u56fe\u7247\n                loader.execute(source, imageName);\n            }\n        }\n        return drawable;\n    }\n}<\/code><\/pre>\n<p>\u7f51\u7edc\u56fe\u7247\u8d44\u6e90\u5f02\u6b65\u4e0b\u8f7d\u7c7b<code>NetworkImageAsyncLoader<\/code>\uff1a<\/p>\n<pre><code class=\"language-java\">public class NetworkImageAsyncLoader extends AsyncTask&lt;String, Integer, Void&gt; {\n\n    private static final String TAG = &quot;yezhou&quot;;\n\n    private String imageName;\n\n    @Override\n    protected Void doInBackground(String... params) {\n        \/\/ \u52a0\u8f7d\u7f51\u7edc\u56fe\u7247\n        loadNetPic(params[0]);\n        imageName = params[1];\n        return null;\n    }\n\n    @Override\n    protected void onPostExecute(Void result) {\n        super.onPostExecute(result);\n        \/\/ \u56fe\u7247\u52a0\u8f7d\u5b8c\u6210\u56de\u8c03\n        mOnNetworkImageLoader.onImageLoaded();\n    }\n\n    \/**\u52a0\u8f7d\u7f51\u7edc\u56fe\u7247*\/\n    private void loadNetPic(String... params) {\n        String urlStr = params[0];\n        File file = new File(Environment.getExternalStorageDirectory(), &quot;\/images\/&quot; + imageName);\n        InputStream in = null;\n        FileOutputStream out = null;\n        try {\n            URL url = new URL(urlStr);\n            HttpURLConnection connUrl = (HttpURLConnection) url.openConnection();\n            connUrl.setConnectTimeout(5000);\n            connUrl.setRequestMethod(&quot;GET&quot;);\n            if (connUrl.getResponseCode() == 200) {\n                in = connUrl.getInputStream();\n                out = new FileOutputStream(file);\n                byte[] buffer = new byte[1024];\n                int len;\n                while ((len = in.read(buffer))!= -1) {\n                    out.write(buffer, 0, len);\n                }\n            } else {\n                Log.i(TAG, connUrl.getResponseCode() + &quot;&quot;);\n            }\n        } catch (Exception e) {\n            e.printStackTrace();\n        } finally {\n            if(in != null) {\n                try {\n                    in.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n            if(out != null) {\n                try {\n                    out.close();\n                } catch (IOException e) {\n                    e.printStackTrace();\n                }\n            }\n        }\n    }\n\n    private OnNetworkImageLoader mOnNetworkImageLoader = null;\n\n    public void setOnNetworkImageLoader(OnNetworkImageLoader loader) {\n        mOnNetworkImageLoader = loader;\n    }\n\n    public interface OnNetworkImageLoader {\n        void onImageLoaded();\n    }\n}<\/code><\/pre>\n<p>Activity\u8c03\u7528\uff1a<\/p>\n<pre><code class=\"language-java\">public class MainActivity extends AppCompatActivity implements NetworkImageAsyncLoader.OnNetworkImageLoader {\n\n    private NetworkImageGetter mImageGetter;\n    private NetworkImageAsyncLoader mImageLoader;\n\n    @Override\n    protected void onCreate(@Nullable Bundle savedInstanceState) {\n        super.onCreate(savedInstanceState);\n        setContentView(R.layout.activity_main);\n        getSupportActionBar().hide();\n\n        mImageLoader = new NetworkImageAsyncLoader();\n        mImageGetter = new NetworkImageGetter(this, mImageLoader);\n        mImageLoader.setOnNetworkImageLoader(this);\n    }\n\n    private void updateData() {\n        mTvNewsContent.setText(Html.fromHtml(mNews.getContent(), mImageGetter, null));\n    }\n\n    @Override\n    public void onImageLoaded() {\n        \/\/ \u5f53\u6267\u884c\u5b8c\u6210\u540e\u518d\u6b21\u4e3a\u5176\u8bbe\u7f6e\u4e00\u6b21\n        mTvNewsContent.setText(Html.fromHtml(mNews.getContent(), mImageGetter, null));\n    }\n\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Html.ImageGetter\u63a5\u53e3\u5b9e\u73b0\u7c7bNetworkImageGetter\uff1a public final c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[61],"tags":[],"class_list":["post-122","post","type-post","status-publish","format-standard","hentry","category-android-basic"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/122","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=122"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/122\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=122"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=122"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=122"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}