2020年3月26日 第6周 星期四
mode 1:具体代码,可联系我。QQ:386335886
mode 2:https://gitee.com/wang_zhiguo/【老师的Gitee】
目 录
Alt + Insert 快捷键(get、set、构造方法)
引入通用适配器(CommonAdapter.java、ViewHolder.java)
Get请求访问网络:案例(获取网页源码并显示到App上)
菜鸟教程 7.1.3 Android HTTP请求方式:HttpURLConnection
https://www.runoob.com/w3cnote/android-tutorial-httpurlconnection.html
添加网络访问权限
网络访问 不能 在主线程中
获取网页源码,并输出到控制台
只有创建视图的线程,才可以访问视图
获取网页源码,并展示到App上
handler的两种写法(官方and非官方)
展示and代码汇总
运行截图
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/tv_html"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.wangzg.course0602">
<!--网络访问权限-->
<uses-permission android:name="android.permission.INTERNET" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
MainActivity.java
package cn.wangzg.course0602;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.TextView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.URL;
public class MainActivity extends AppCompatActivity {
private TextView tv_html;
// private Handler handler=new Handler(){ //内存泄露,非建议写法
// @Override
// public void handleMessage(@NonNull Message msg) {
// String str= (String) msg.obj; // 接收消息 强转(String)
// tv_html.setText(str);
// }
// };
//官方建议写法
static class MyHandler extends Handler {
// WeakReference to the outer class's instance.
private WeakReference<MainActivity> mOuter; //WeakReference弱引用
public MyHandler(MainActivity activity) {
mOuter = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
MainActivity outer = mOuter.get();
if (outer != null) {
// Do something with outer as your wish.
if (msg.what == 1) {
String str = (String) msg.obj;
outer.tv_html.setText(str);
}
}
}
}
private MyHandler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new MyHandler(this);
// //main thread
// //局部转全局 Ctrl+alt+F full
tv_html = findViewById(R.id.tv_html);
new Thread() {//new thread 新建线程并启动start()
@Override
public void run() {
String strUrl = "https://www.runoob.com/w3cnote/android-tutorial-httpurlconnection.html";
String s = doGet(strUrl);
//System.out.println(s); // 网络访问在主线程中,会报异常。--》耗时操作(文件访问、网络访问)-->子线程
//tv_html.setText(s);
Message msg = new Message();
msg.what = 1;//区分不同的返回值 区分不同的线程 可能有多个线程【了解】
msg.obj = s; // 把参数传递过去
handler.sendMessage(msg); // 通过sendMessage发送消息,handler处理消息 与主线程进行通信,需要使用handler
}
}.start();
// tv_html.setText(s); // s设置为全局变量,也会报错,app直接崩溃
}
/** 发送Get请求
* @param strUrl 请求地址
* @return 返回String */
private String doGet(String strUrl) {
String ret = null;
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//conn.setRequestMethod("GET");//默认Get请求,可以省略
conn.setConnectTimeout(5000);
InputStream is = conn.getInputStream();
ret = is2String(is);
conn.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return ret;
}
/** 将流转为字符串
* @param inStream 输入流
* @return 返回字符串
* @throws IOException */
private String is2String(InputStream inStream) throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
inStream.close();
return new String(outStream.toByteArray(), "UTF-8");
}
}
玩Android:获取首页文章列表
新建Activity
设置Activity的启动顺序
设置Activity的启动顺序---展示
约束布局中添加ListView
WanListActivity.java(第一步)
数据获取测试
activity_wan_list.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".WanListActivity">
<ListView
android:id="@+id/listArticle"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
WanListActivity.java
package cn.wangzg.course0602;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ListView;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.URL;
public class WanListActivity extends AppCompatActivity {
private ListView listArticle;
//官方建议写法
static class MyHandler extends Handler {
// WeakReference to the outer class's instance.
private WeakReference<WanListActivity> mOuter; //WeakReference弱引用
public MyHandler(WanListActivity activity) {
mOuter = new WeakReference<WanListActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
WanListActivity outer = mOuter.get();
if (outer != null) {
// Do something with outer as your wish.
if (msg.what == 1) {
String str = (String) msg.obj;
//outer.tv_html.setText(str);
}
}
}
}
private MyHandler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wan_list);
initView();
getData();
}
private void getData() {
new Thread() {//new thread 新建线程并启动start()
@Override
public void run() {
String strUrl = "https://wanandroid.com/article/list/0/json";
String s = doGet(strUrl);
System.out.println(s); // 网络访问在主线程中,会报异常。--》耗时操作(文件访问、网络访问)-->子线程
//tv_html.setText(s);
// Message msg = new Message();
// msg.what = 1;//区分不同的返回值 区分不同的线程 可能有多个线程【了解】
// msg.obj = s; // 把参数传递过去
// handler.sendMessage(msg); // 通过sendMessage发送消息,handler处理消息 与主线程进行通信,需要使用handler
}
}.start();
}
private void initView() {
handler = new MyHandler(this);
listArticle = findViewById(R.id.listArticle);
}
/** 发送Get请求
* @param strUrl 请求地址
* @return 返回String */
private String doGet(String strUrl) {
String ret = null;
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//conn.setRequestMethod("GET");//默认Get请求,可以省略
conn.setConnectTimeout(5000);
InputStream is = conn.getInputStream();
ret = is2String(is);
conn.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return ret;
}
/** 将流转为字符串
* @param inStream 输入流
* @return 返回字符串
* @throws IOException */
private String is2String(InputStream inStream) throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
inStream.close();
return new String(outStream.toByteArray(), "UTF-8");
}
}
查看Json文件(火狐浏览器)
https://wanandroid.com/article/list/0/json
定义解析类,存储解析出来的信息(Article.java)
Alt + Insert 快捷键(get、set、构造方法)
package cn.wangzg.course0602;
public class Article {
private String title;
private String shareUser;//分享人
private String superChapterName; // 分类名
private String chapterName;
private String niceDate;
private String link;
// alt + insert 快捷键(get、set、构造方法)
@Override
public String toString() {
return "Article{" +
"title='" + title + '\'' +
", shareUser='" + shareUser + '\'' +
", superChapterName='" + superChapterName + '\'' +
", chapterName='" + chapterName + '\'' +
", niceDate='" + niceDate + '\'' +
", link='" + link + '\'' +
'}';
}
public void setTitle(String title) {
this.title = title;
}
public void setShareUser(String shareUser) {
this.shareUser = shareUser;
}
public void setSuperChapterName(String superChapterName) {
this.superChapterName = superChapterName;
}
public void setChapterName(String chapterName) {
this.chapterName = chapterName;
}
public void setNiceDate(String niceDate) {
this.niceDate = niceDate;
}
public void setLink(String link) {
this.link = link;
}
public String getTitle() {
return title;
}
public String getShareUser() {
return shareUser;
}
public String getSuperChapterName() {
return superChapterName;
}
public String getChapterName() {
return chapterName;
}
public String getNiceDate() {
return niceDate;
}
public String getLink() {
return link;
}
}
解析从网站上获取的数据
输出Json解析结果
package cn.wangzg.course0602;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ListView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
public class WanListActivity extends AppCompatActivity {
private ListView listArticle;
private ArrayList<Article> articles;
//官方建议写法
static class MyHandler extends Handler {
// WeakReference to the outer class's instance.
private WeakReference<WanListActivity> mOuter; //WeakReference弱引用
public MyHandler(WanListActivity activity) {
mOuter = new WeakReference<WanListActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
WanListActivity outer = mOuter.get();
if (outer != null) {
// Do something with outer as your wish.
if (msg.what == 1) {
String str = (String) msg.obj;
//outer.tv_html.setText(str);
}
}
}
}
private MyHandler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wan_list);
initView();
getData();
}
private void getData() {
new Thread() {//new thread 新建线程并启动start()
@Override
public void run() {
String strUrl = "https://wanandroid.com/article/list/0/json";
String s = doGet(strUrl);
//System.out.println(s); // 网络访问在主线程中,会报异常。--》耗时操作(文件访问、网络访问)-->子线程
// 对s中的json数据进行解析。定义list集合 存储 解析出来的文章的数据
articles = parseArticle(s);
for (Article a : articles) {
System.out.println(a.toString());
}
//tv_html.setText(s);
// Message msg = new Message();
// msg.what = 1;//区分不同的返回值 区分不同的线程 可能有多个线程【了解】
// msg.obj = s; // 把参数传递过去
// handler.sendMessage(msg); // 通过sendMessage发送消息,handler处理消息 与主线程进行通信,需要使用handler
}
}.start();
}
private ArrayList<Article> parseArticle(String s) {
ArrayList<Article> list = new ArrayList<>();
Article article;
try {
JSONObject object = new JSONObject(s);
int errCode = object.optInt("errorCode");
if (errCode == 0) {
JSONArray array = object.optJSONObject("data").optJSONArray("datas");
for (int i = 0; i < array.length(); i++) {
article = new Article();
JSONObject obj = array.optJSONObject(i);
article.setTitle(obj.optString("title"));
article.setShareUser(obj.optString("shareUser"));
article.setSuperChapterName(obj.optString("superChapterName"));
article.setChapterName(obj.optString("chapterName"));
article.setNiceDate(obj.optString("niceDate"));
article.setLink(obj.optString("link"));
list.add(article);
}
} else {
return null;
}
} catch (JSONException e) {
e.printStackTrace();
}
return list;
}
private void initView() {
handler = new MyHandler(this);
listArticle = findViewById(R.id.listArticle);
}
/**
* 发送Get请求
*
* @param strUrl 请求地址
* @return 返回String
*/
private String doGet(String strUrl) {
String ret = null;
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//conn.setRequestMethod("GET");//默认Get请求,可以省略
conn.setConnectTimeout(5000);
InputStream is = conn.getInputStream();
ret = is2String(is);
conn.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return ret;
}
/**
* 将流转为字符串
*
* @param inStream 输入流
* @return 返回字符串
* @throws IOException
*/
private String is2String(InputStream inStream) throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
inStream.close();
return new String(outStream.toByteArray(), "UTF-8");
}
}
创建显示文章的布局
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:text="TextView"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="分享人:"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textView" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="TextView"
app:layout_constraintBaseline_toBaselineOf="@+id/textView2"
app:layout_constraintStart_toEndOf="@+id/textView2" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="分类:"
app:layout_constraintBaseline_toBaselineOf="@+id/textView3"
app:layout_constraintStart_toEndOf="@+id/textView3" />
<TextView
android:id="@+id/textView5"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:text="TextView"
app:layout_constraintBaseline_toBaselineOf="@+id/textView4"
app:layout_constraintStart_toEndOf="@+id/textView4" />
</androidx.constraintlayout.widget.ConstraintLayout>
引入通用适配器(CommonAdapter.java、ViewHolder.java)
CommonAdapter.java
package cn.wangzg.course0602;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import java.util.ArrayList;
/**
* Time: 2019/2/1
* Author: wangzhiguo
* Description: 功能描述
*/
public abstract class CommonAdapter<T> extends BaseAdapter {
protected LayoutInflater mInflater;
protected Context mContext;
protected ArrayList<T> mDatas;
protected final int mItemLayoutId;
public CommonAdapter(Context context, ArrayList<T> mDatas, int itemLayoutId)
{
mInflater = LayoutInflater.from(context);
this.mContext = context;
this.mDatas = mDatas;
mItemLayoutId = itemLayoutId;
}
@Override
public int getCount() {
return mDatas==null?0:mDatas.size();
}
@Override
public T getItem(int position) {
return mDatas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder = getViewHolder(position, convertView,
parent);
convert(viewHolder, getItem(position));
return viewHolder.getConvertView();
}
public abstract void convert(ViewHolder helper, T item);
private ViewHolder getViewHolder(int position, View convertView,
ViewGroup parent)
{
return ViewHolder.get(mContext, convertView, parent, mItemLayoutId,
position);
}
public ArrayList<T> getmDatas() {
return mDatas;
}
public void setmDatas(ArrayList<T> mDatas) {
this.mDatas = mDatas;
notifyDataSetChanged();
}
public void addmDatas(ArrayList<T> mDatas) {
if(this.mDatas==null) {
this.mDatas = mDatas;
}else {
this.mDatas.addAll(mDatas);
}
notifyDataSetChanged();
}
}
ViewHolder.java
package cn.wangzg.course0602;
import android.content.Context;
import android.graphics.Bitmap;
import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
//import com.bumptech.glide.Glide;
/**
* Time: 2019/2/1
* Author: wangzhiguo
* Description: 功能描述
*/
public class ViewHolder {
private final SparseArray<View> mViews;
private View mConvertView;
private Context context;
private ViewHolder(Context context, ViewGroup parent, int layoutId,
int position)
{
this.mViews = new SparseArray<View>();
mConvertView = LayoutInflater.from(context).inflate(layoutId, parent,
false);
//setTag
mConvertView.setTag(this);
this.context = context;
}
/**
* 拿到一个ViewHolder对象
* @param context
* @param convertView
* @param parent
* @param layoutId
* @param position
* @return
*/
public static ViewHolder get(Context context, View convertView,
ViewGroup parent, int layoutId, int position)
{
if (convertView == null)
{
return new ViewHolder(context, parent, layoutId, position);
}
return (ViewHolder) convertView.getTag();
}
/**
* 通过控件的Id获取对于的控件,如果没有则加入views
* @param viewId
* @return
*/
public <T extends View> T getView(int viewId)
{
View view = mViews.get(viewId);
if (view == null)
{
view = mConvertView.findViewById(viewId);
mViews.put(viewId, view);
}
return (T) view;
}
public View getConvertView()
{
return mConvertView;
}
/**
* 为TextView设置字符串
*
* @param viewId
* @param text
* @return
*/
public ViewHolder setText(int viewId, String text)
{
TextView view = getView(viewId);
view.setText(text);
return this;
}
/**
* 为ImageView设置图片
*
* @param viewId
* @param drawableId
* @return
*/
public ViewHolder setImageResource(int viewId, int drawableId)
{
ImageView view = getView(viewId);
view.setImageResource(drawableId);
return this;
}
/**
* 为ImageView设置图片
*
* @param viewId
* @param bm
* @return
*/
public ViewHolder setImageBitmap(int viewId, Bitmap bm)
{
ImageView view = getView(viewId);
view.setImageBitmap(bm);
return this;
}
/**
* 为ImageView设置图片
*
* @param viewId
* @param url
* @return
*/
public ViewHolder setImageByUrl(int viewId, String url)
{
// Glide.with(context)
// .load(url)
// .into((ImageView) getView(viewId));
return this;
}
}
设置适配器
ListView展示截图
WanListActivity.java
package cn.wangzg.course0602;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.widget.ListView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.ref.WeakReference;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
public class WanListActivity extends AppCompatActivity {
private ListView listArticle;
private ArrayList<Article> articles;
private CommonAdapter<Article> adapter;
//官方建议写法
static class MyHandler extends Handler {
// WeakReference to the outer class's instance.
private WeakReference<WanListActivity> mOuter;
public MyHandler(WanListActivity activity) {
mOuter = new WeakReference<WanListActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
WanListActivity outer = mOuter.get();
if (outer != null) {
if (msg.what == 1) {
String str = (String) msg.obj;
//outer.tv_html.setText(str);
outer.adapter.setmDatas(outer.articles);
}
}
}
}
private MyHandler handler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_wan_list);
initView();
getData();
}
private void getData() {
new Thread() {//new thread
@Override
public void run() {
String strUrl = "https://www.wanandroid.com/article/list/0/json";
String s = doGet(strUrl);
articles = parseArticle(s);
for (Article a : articles) {
System.out.println(a.toString());
}
//tv_html.setText(s);
// Message msg=new Message();
// msg.what=1;//区分不同的返回值
// //msg.obj=s;
// handler.sendMessage(msg);
// 对上述4行代码进行简化,只能在Activity中进行
runOnUiThread(new Runnable() { // 回到主线程执行内容:官方建议写法+private MyHandler handler; 这些内容,可以不要。
@Override
public void run() {
adapter.setmDatas(articles);
}
});
}
}.start();
}
private ArrayList<Article> parseArticle(String s) {
ArrayList<Article> list = new ArrayList<>();
Article article;
try {
JSONObject object = new JSONObject(s);
int errCode = object.optInt("errorCode");
if (errCode == 0) {
JSONArray array = object.optJSONObject("data")
.optJSONArray("datas");
for (int i = 0; i < array.length(); i++) {
article = new Article();
JSONObject obj = array.optJSONObject(i);
article.setTitle(obj.optString("title"));
article.setShareUser(obj.optString("shareUser"));
article.setSuperChapterName(obj.optString("superChapterName"));
article.setChapterName(obj.optString("chapterName"));
article.setNiceDate(obj.optString("niceDate"));
article.setLink(obj.optString("link"));
list.add(article);
}
} else {
return null;
}
} catch (JSONException e) {
e.printStackTrace();
}
return list;
}
private void initView() {
//handler = new MyHandler(this);
listArticle = findViewById(R.id.listArticle);
adapter = new CommonAdapter<Article>(this, null, R.layout.item_article) {
@Override
public void convert(ViewHolder helper, Article item) {
helper.setText(R.id.textView, item.getTitle());
helper.setText(R.id.textView3, item.getShareUser());
helper.setText(R.id.textView5, item.getSuperChapterName() + "/" + item.getChapterName());
}
};
listArticle.setAdapter(adapter); // 设置适配器
}
/**
* 发送Get请求
*
* @param strUrl 请求地址
* @return 返回String
*/
private String doGet(String strUrl) {
String ret = null;
try {
URL url = new URL(strUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//conn.setRequestMethod("GET");//默认,可以省略
conn.setConnectTimeout(5000);
InputStream is = conn.getInputStream();
ret = is2String(is);
conn.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
return ret;
}
/**
* 将流转为字符串
*
* @param inStream 输入流
* @return 返回字符串
* @throws IOException
*/
private String is2String(InputStream inStream) throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = inStream.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
inStream.close();
return new String(outStream.toByteArray(), "UTF-8");
}
}
点击ListView中的Item,显示具体内容
菜鸟教程 7.5.1 WebView(网页视图)基本用法
https://www.runoob.com/w3cnote/android-tutorial-webview.html
新建Activity,在其中放置WebView组件,通过WebView打开文章,进行阅读。