利用Handler实现网络数据下载Json并转换成实体类的封装
来源:互联网 发布:奇门择日软件 编辑:程序博客网 时间:2024/05/18 10:30
NetWorkRunable类
用于实现子线程下载网络数据, 并转换成Json字符串, 然后通过Gson实现与实体类的转换, 所以必须导入Google的Gson包, 并写自己的实体类(记得加上注解)
/** * Created by Lulu on 2016/9/1. * 封装访问网络的类, Handler实现 */public class NetWorkRunable<T> implements Runnable, Handler.Callback { private final Handler handler; private String url; private Class<T> t; private MyCallback<T> callback; public NetWorkRunable(String url, Class<T> t, MyCallback<T> callback) { this.url = url; this.t = t; this.callback = callback; //Looper.getMainLooper(): 因为Handler如果不指定, 得到的是当前线程的looper //现在直接将主线程的Looper传入!!! handler = new Handler(Looper.getMainLooper(), this);//现在它一定在主线程中执行 } @Override public boolean handleMessage(Message msg) { Object o = msg.obj; switch (msg.what) { case 0: callback.onSuccess((T) o); break; case 1: callback.onFailed((Exception) o); break; } //消息不再传递, 被截获 return true; } public interface MyCallback<S> { void onSuccess(S s); void onFailed(Exception e); } @Override public void run() { try { HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection(); connection.setRequestMethod("GET"); connection.setDoInput(true); int code = connection.getResponseCode(); if (code == 200) { InputStream is = connection.getInputStream(); ByteArrayOutputStream bos = new ByteArrayOutputStream(); byte[] buffer = new byte[102400]; int length; while ((length = is.read(buffer)) != -1) { bos.write(buffer, 0, length); } String str = bos.toString("UTF-8"); Gson gson = new Gson(); handler.obtainMessage(0, gson.fromJson(str, t)).sendToTarget(); } else { handler.obtainMessage(1, new RuntimeException("服务器异常")); } } catch (IOException e) { handler.obtainMessage(1, new RuntimeException("IO出现异常")).sendToTarget(); e.printStackTrace(); } }}
测试实体类
public class Entry { @SerializedName("title") private String title; @SerializedName("message") private String message; ...//省略getter和setter方法}
测试Activity
class MainActivity extends AppCompatActivity implements NetWorkRunable.MyCallback<Entry> { private static final String TAG = MainActivity.class.getSimpleName(); private WebView webView; 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); webView = (WebView) findViewById(R.id.main_web); String url = "http://www.tngou.net/api/top/show?id=106"; new Thread(new NetWorkRunable<>(url, Entry.class, this)).start(); } @Override public void onSuccess(Entry entry) { Log.d(TAG, "onSuccess: " + entry.getTitle()); setTitle(entry.getTitle()); webView.loadDataWithBaseURL("", CSS + entry.getMessage(), "text/html; charset=utf-8", "UTF-8", null); } @Override public void onFailed(Exception e) { webView.loadDataWithBaseURL("", e.getMessage(), "text/html; charset=utf-8", "UTF-8", null); }}
效果图
3 0
- 利用Handler实现网络数据下载Json并转换成实体类的封装
- 将JSON数据转换成JAVA的实体类
- Json数据转换成实体类
- Json字符串和Java实体类之间的相互转换(利用jackson实现)
- C#中将JSon数据转换成实体类,将实体类转换成Json
- API json多层数据实体类封装(利用泛型技术)
- json数据与实体类之间的相互转换
- 实现实体类和json类之间的相互转换
- 利用 js-xlsx 实现 Excel 文件导入并解析Excel数据成json格式的数据
- 利用泛型实现通用的数据实体类填充
- 封装的工具类(网络获取Json,图片,下载图片,下载Mp3,下载视频)
- iOS中使用KVC实现JSON数据与Objective-C实体对象之间的转换
- iOS中使用KVC实现JSON数据与Objective-C实体对象之间的转换
- Json数据封装到相应的实体类中(工具类)
- 利用JQuery jsonp实现Ajax跨域请求 .Net 的*.handler 和 WebService,返回json数据
- 利用JQuery jsonp实现Ajax跨域请求 .Net 的*.handler 和 WebService,返回json数据
- 利用JQuery jsonp实现Ajax跨域请求 .Net 的*.handler 和 WebService,返回json数据
- JSON字符串转换成java实体类的工具
- Java(字符流使用)
- Java使用第三方jar包实现邮件验证码
- 冯大辉这件事情上我支持大辉
- 维护x的秩
- PHP验证码代码分享
- 利用Handler实现网络数据下载Json并转换成实体类的封装
- 支付宝微信app 支付签名后台完整demo
- 为什么受伤的总是技术大牛
- 函数和方法的区别
- React Native学习指南
- Java打印输出数组和集合
- 返回局部指针
- 剑指offer-排序算法
- mysql表备份、数据备份、数据导入