网络编程
16lz
2021-01-24
Android网络编程
-
-
- 加载网络图片
- 访问网络数据
- json
- WebView 网页加载控件
-
安卓与互联网交互的三种方式:
加载网络图片
例子:加载一张网络图片到ImageView上。
https://03imgmini.eastday.com//mobile//20201218//20201218133813_362200891ebb137183288595c85eabf5_2_mwpm_03200403.jpg
程序要使用一些特殊的功能(如网络连接),需要在清单文件中添加相关的权限。
<uses-permission android:name="android.permission.INTERNET"/>
public class MainActivity extends Activity { //图片连接 private String mUrl = "https://03imgmini.eastday.com//mobile//20201218//20201218133813_362200891ebb137183288595c85eabf5_2_mwpm_03200403.jpg"; //图片显示控件 private ImageView mImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mImageView = (ImageView) findViewById(R.id.image_view); //调用图片加载函数 loadNetImage(mUrl, mImageView); } /** * 用于加载某个网络图片到图片显示控件上 * @param url 网络图片的地址 * @param view 要加载图片图片的控件 */ public void loadNetImage(final String url,ImageView view) { new Thread() { public void run() { //此处临时中转一下? String urlTemp = url; try { //转换成标准连接格式类的对象 URL url = new URL(urlTemp); //创建网络连接对象 HttpURLConnection conn = (HttpURLConnection) url.openConnection(); //获得Http状态码 int httpCode = conn.getResponseCode(); //如果成功了再执行下一步 if(httpCode == 200) { //通过连接对象获得输入流数据 InputStream is = conn.getInputStream(); //TODO 可以保存在本地了 //将输入流转换为Bitmap对象 final Bitmap bitmap = BitmapFactory.decodeStream(is); //切换到主线程中去设置图片显示 runOnUiThread(new Runnable() { public void run() { mImageView.setImageBitmap(bitmap); } }); //关闭流 is.close(); }else { Log.d("NetImage", "httpCode is not 200,is "+httpCode); } } catch (MalformedURLException e) { e.printStackTrace(); Log.d("NetImage", e.toString()); } catch (IOException e) { e.printStackTrace(); Log.d("NetImage", e.toString()); } } }.start(); }}
访问网络数据
接口由三部分组成:(数据来自聚合数据平台API)
http://v.juhe.cn/toutiao/index
?
type=tiyu
&
key=5465c4c5d60f72c3d756a9f1a9b8437d
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getData(); } /** * 访问服务器,并获得服务器返回的API数据 */ private void getData() { new Thread() { public void run() { String site = "http://v.juhe.cn/toutiao/index?type=tiyu&key=5465c4c5d60f72c3d756a9f1a9b8437d"; try { URL url = new URL(site); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); int httpCode = conn.getResponseCode(); if (httpCode == 200) { // 字节输入流 InputStream is = conn.getInputStream(); // 字节流→字符流 InputStreamReader isr = new InputStreamReader(is); // 转换为缓冲流提高效率 BufferedReader br = new BufferedReader(isr); // "水盆" String buffer = new String(); // 存储已经读取的字符 String readStr = new String(); // 循环读取 while ((buffer = br.readLine()) != null) { // 将刚读取的字符串拼接到之前读取的字符串上 readStr += buffer; } // 关闭流 br.close(); isr.close(); is.close(); Log.d("MainActivity", readStr); } else { Log.d("MainActivity", "http code is not 200,is " + httpCode); } } catch (MalformedURLException e) { Log.d("MainActivity", e.toString()); } catch (IOException e) { Log.d("MainActivity", e.toString()); } } }.start(); }}
json
服务器返回的一对字符串实际上是JSON格式的。
格式(逐级嵌套):
{}表示的是JSONObject对象,内部是键值对
[]表示的是JSONArray对象,即JSONObject数组。
每条新闻包含的内容:
uniquekey ----每条新闻一个唯一识别码
title(必用) -----新闻标题
date -----新闻时间
category -----新闻类别
author_name -----新闻作者
url -----新闻连接
thumbnail_pic_s -----新闻图片
//解析JSON数据JSONObject object = new JSONObject(readStr);JSONObject result = object.getJSONObject("result");JSONArray data = result.getJSONArray("data"); //拿到新闻数组for(int i = 0;i<data.length();i++) { //遍历新闻数组JSONObject item = data.getJSONObject(i); //获得第i个新闻对象//解析新闻的内容String link = item.getString("url");String title = item.getString("title");//TODO 如果有一个ArrayList,那么可以把新闻内容解析后添加进去,这样就可以使用MVP模式加载滑动列表了 //补充:跨线程使用List,有比ArrayList还好用的类型Vector //Vector用法跟ArrayList完全一样,区别在于多线程的优化更好。 Log.d("MainActivity", title);Log.d("MainActivity", link);Log.d("MainActivity", " ");}
使用Android给我们提供的扣脚Json解析类果然要慢慢扣,当然你也可以将解析的过程 反过来,自己拼接JSON,时间关系,这里就慢慢拼接了,哈哈,当然进阶部分我们 学习了第三方的一些Json解析库就轻松多了。
WebView 网页加载控件
专用于HTTP网页加载。
public class MainActivity extends Activity { private WebView mWebView; //进度条弹窗 private ProgressDialog mDialog; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDialog = new ProgressDialog(MainActivity.this); mDialog.setTitle("科大头条"); mDialog.setMessage("正在加载中"); mWebView = (WebView) findViewById(R.id.web_view); //1.设置使用自己的WebView作为主网页加载控件 //2.获得加载的不同状态的回调方法 mWebView.setWebViewClient(new WebViewClient() { //网络页面开始加载的回调 @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); mDialog.show(); //显示进度条 } //网络页面加载结束的回调 @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); mDialog.dismiss(); //关闭进度条 } }); //开启JS mWebView.getSettings().setJavaScriptEnabled(true); //加载网页 mWebView.loadUrl("https://mini.eastday.com//a//201218141503193.html?qid=juheshuju&referrer="); }}
更多相关文章
- ImageView的android:scaleType属性和 src、Background之前的区别
- (4.1.22.2)Android之取消ViewPage+Fragment的预加载 2015
- Android中用webView引用js
- android 程序中选择图片的代码
- 常用方法(1)------根据图片的url路径获得Bitmap对象
- Android(安卓)BaseFragment封装
- android 根据图片的URI获取对应的图片
- 3D相册图片滑动+倾斜+放大+倒影处理
- Android通过相机拍照后无法获取URI问题解决