例子:加载一张网络图片到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格式的。
格式(逐级嵌套):
{}表示的是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解析库就轻松多了。
专用于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=");
}
}