Android复习03(Get请求访问网络[详解]、获取文章列表)
2020年3月26日 第6周 星期四
https://ke.qq.com/webcourse/index.html#cid=989760&term_id=101085595&taid=14724409&lite=1&vid=5285890800493379095
mode 1:具体代码,可联系我。QQ:386335886
mode 2:https://gitee.com/wang_zhiguo/【老师的Gitee】
目 录
Get请求访问网络:案例(获取网页源码并显示到App上)
添加网络访问权限
网络访问 不能 在主线程中
获取网页源码,并输出到控制台
只有创建视图的线程,才可以访问视图
获取网页源码,并展示到App上
handler的两种写法(官方and非官方)
展示and代码汇总
运行截图
activity_main.xml
AndroidManifest.xml
MainActivity.java
玩Android:获取首页文章列表
新建Activity
设置Activity的启动顺序
设置Activity的启动顺序---展示
约束布局中添加ListView
WanListActivity.java(第一步)
数据获取测试
activity_wan_list.xml
WanListActivity.java
查看Json文件(火狐浏览器)
定义解析类,存储解析出来的信息(Article.java)
Alt + Insert 快捷键(get、set、构造方法)
解析从网站上获取的数据
输出Json解析结果
创建显示文章的布局
引入通用适配器(CommonAdapter.java、ViewHolder.java)
CommonAdapter.java
ViewHolder.java
设置适配器
ListView展示截图
WanListActivity.java
点击ListView中的Item,显示具体内容
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"><TextViewandroid: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" /><applicationandroid: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);}@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);handler = new MyHandler(this);
// //main thread
// //局部转全局 Ctrl+alt+F fulltv_html = findViewById(R.id.tv_html);new Thread() {//new thread 新建线程并启动start()@Overridepublic 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"><ListViewandroid: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);}@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_wan_list);initView();getData();}private void getData() {new Thread() {//new thread 新建线程并启动start()@Overridepublic 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、构造方法)@Overridepublic 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);}@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_wan_list);initView();getData();}private void getData() {new Thread() {//new thread 新建线程并启动start()@Overridepublic 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"><TextViewandroid: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" /><TextViewandroid: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" /><TextViewandroid: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" /><TextViewandroid: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" /><TextViewandroid: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;}@Overridepublic int getCount() {return mDatas==null?0:mDatas.size();}@Overridepublic T getItem(int position) {return mDatas.get(position);}@Overridepublic long getItemId(int position) {return position;}@Overridepublic 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);//setTagmConvertView.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);}@Overridepublic 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_wan_list);initView();getData();}private void getData() {new Thread() {//new thread@Overridepublic 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; 这些内容,可以不要。@Overridepublic 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) {@Overridepublic 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打开文章,进行阅读。
Android复习03(Get请求访问网络[详解]、获取文章列表)相关推荐
- android xutils json请求,Android Xutils3网络请求的封装详解及实例代码
Xutils3网络请求的封装详解 封装了一个Xutil3的网络请求工具类,分享给大家,本人水平有限,不足之处欢迎指出. 使用前先配置xutils3: 1.gradle中添加 compile 'org. ...
- Android复习05【网络编程---WebView获取文章信息、保存用户名与密码、设置菜单样式、收藏文章列表】
2020-04-02-星期四[源码可私聊我,QQ:386335886] 写篇文章不容易,点个赞再走吧,求求了~ 目 录 网络访问-思维导图 玩Android网站---查看登录Cookie 适配器 ...
- java外部接口图解_java代码实现访问网络外部接口并获取数据的工具类详解
java代码实现访问网络外部接口并获取数据的工具类 工具类代码,可以直接copy使用 package com.yqzj.util; import org.apache.log4j.LogManager ...
- Android 8.0学习(32)---Android 8.0源码目录结构详解
Android 8.0源码目录结构详解 android的移植按如下流程: (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来. (2)正确挂载文件系统 ...
- Dockerfile详解、镜像发布、网络详解学习
一.DockerFile 1.Docker介绍 Dockerfile是用来构建Docker镜像的文件是命令参数脚本.docker build命令用于从Dockerfile构建镜像.可以在docker ...
- Android 各大厂面试题汇总与详解(持续更新)
介绍 目前网络中出现了好多各种面试题的汇总,有真实的也有虚假的,所以今年我将会汇总各大公司面试比较常见的问题,逐一进行解答.会一直集成,也会收集大家提供的面试题,如有错误,请大家指出,经过排查存在,会 ...
- openstack 网络详解(Essex版)
openstack网络详解 本博客欢迎转发,但请保留原作者信息(@孔令贤HW)!内容系本人学习.研究和总结,如有雷同,实属荣幸! 这篇文章基本是参考了http://www.mirantis.co ...
- linux配置网络详解
linux配置网络详解 文章目录 linux配置网络详解 前置准备 配置流程 错误排查 前置准备 确定是否有网,比如在家里,确定是否连上网线?确定这个网线的网关是什么?(这个需要和给你办网的人确定), ...
- 《微信小程序》 数据访问实例详解
如图所示 1.每个视图(.wxml)只需要添加对应名字的脚本(.js)和样式(.wxss)就可以了,不需要引用,page下面的脚本以及样式都是继承至最外面的app.js , app.wxcss 2.脚 ...
最新文章
- Java项目:后台管理系统脚手架项目(java+SpringBoot+FreeMarker+mysql+JSP)
- Web网页布局的主要方式
- 本地不安装Oracle,plsql远程连接数据库
- 把字符串3,1,2,4以,分割拆分为数组,数组元素并按从小到大的顺序排列
- mysql 查询 集合_MySQL使用集合函数进行查询操作实例详解
- Ubuntu14.04 下截图工具与设置快捷键
- php导入excel文件 视频,PHP导入Excel文件
- 《EMCAScript6入门》读书笔记——2.let和const命令
- python输出字符_python输出字符
- Valid Palindrome leetcode125
- vim如何删除^M字符
- Reza Zafarani经典教材-《社交媒体挖掘》PDF+随书课件打包分享
- 使用HttpClient和OkHttp实现模拟登录方正教务系统
- 文献阅读(03)Computing Graph Neural Networks: A Survey from Algorithms to Accelerators
- 普通卷积、分组卷积和深度分离卷积概念以及参数量计算
- 中国移动云能力中心IaaS产品部2021年招聘
- 计算机学业水平测试初中生操作题,初中学业水平考试信息技术考试操作题常见题型及作答方法...
- Hololens2画面传输到电脑上的方法(Hololens2录视频下载方法)
- 开机提示:one of your disks needs to be checked解决方法
- MATLAB实现k-means算法(k-均值)对无标签数据进行聚类,并通过肘部法则确定聚类类别
热门文章
- replace into mysql去重_上传 phpexcel 类 入库并入库前去重
- mysql 创建临时表 时间类型_MySQL问答系列之什么情况下会用到临时表
- 单相桥式相控整流电路multisim仿真_单相半波可控整流电路电阻负载的Matlab Simulink仿真...
- 最后一篇,小白看的Python基础教程,详细得很(十一)
- 梦世界服务器修改指令,我的世界梦世界有哪些指令必须知道 梦世界所有必须知道指令汇总...
- ​EMNLP 2021 最新综述:语言模型中的关系性知识
- 仅输入单张图片,就能“看”出物体材质!这篇图形学论文已被SIGGRAPH 2021收录...
- 你可能不需要固定词表:一种与词表无关的组合式词向量方法
- AAAI 2020 | NAS+目标检测:AI设计的目标检测模型长啥样?
- 路痴的单身小菡 BFS求最短路径+DFS求路径数