Android10--Android之动态接口实现加载网页和图片

承接上文:

今天我们使用动态接口去实现,更好的实现了封装性,通过接口,我们可以拿到NetWorkAsyncTask的一个类.

1.首先我们要有 一个注解,这个注解可以拿到我们的url..


@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UrlString {
    String value();
}

2.然后我们要有一个接口,通过这个接口我们我可拿到我们想要的东西.
之后我们如果需要拿到不同的实体类,我们只需要重写一个接口传入不同的url即可.

public interface TopServer {
    @UrlString("http://www.tngou.net/api/top/show?id=%d")
    NetworkTask<ShowEntry> getShow(int id);
}

然后实现我们的动态接口

public class Tools {
    public static<T> T getInstance(Class<T> type) {
        Object o = Proxy.newProxyInstance(type.getClassLoader(), new Class[]{type}, new MyHandler());
        return (T) o;
    }
    private static class MyHandler implements InvocationHandler {

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            UrlString annotation = method.getAnnotation(UrlString.class);
            if (annotation != null) {
                String url = String.format(Locale.CHINA, annotation.value(), args);
                Class<?> returnType = method.getReturnType();
                if (returnType.equals(NetworkTask.class)) {
                    ParameterizedType type = (ParameterizedType) method.getGenericReturnType();
                    Type entryType = type.getActualTypeArguments()[0];
                    return new NetworkTask<>(url, (Class) entryType);
                }
            }
            return null;
        }
    }
}

测试类:

public class MainActivity extends AppCompatActivity implements NetworkTask.Callback<ShowEntry> {

    private WebView web;
    private ImageView image;
    private static final String CSS = "<style>img{max-width:100%}</style>";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        web = (WebView) findViewById(R.id.main2_web);
        image = (ImageView) findViewById(R.id.main2_image);
        TopServer server = Tools.getInstance(TopServer.class);
        NetworkTask<ShowEntry> show = server.getShow(3);
        show.execute(this);
    }

    @Override
    public void onSuccess(ShowEntry entry) {
        setTitle(entry.getTitle());
        new ImageLoader(image).execute("http://tnfs.tngou.net/img" + entry.getImg());
        web.loadDataWithBaseURL("http://www.tngou.net", CSS + entry.getMessage(), "text/html; charset=utf-8", "UTF-8", null);
    }

    @Override
    public void onFail(Exception e) {
        e.printStackTrace();
        Toast.makeText(MainActivity.this, "网络错误", Toast.LENGTH_SHORT).show();
    }
}

之后的使用.我们可以将加载图片,网页内容,和动态接口,注解,这几个类放到一起,之后当做一个Moudle直接道途使用即可..

结果实现:
和上篇的效果一样…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值