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请求访问网络[详解]、获取文章列表)相关推荐

  1. android xutils json请求,Android Xutils3网络请求的封装详解及实例代码

    Xutils3网络请求的封装详解 封装了一个Xutil3的网络请求工具类,分享给大家,本人水平有限,不足之处欢迎指出. 使用前先配置xutils3: 1.gradle中添加 compile 'org. ...

  2. Android复习05【网络编程---WebView获取文章信息、保存用户名与密码、设置菜单样式、收藏文章列表】

    2020-04-02-星期四[源码可私聊我,QQ:386335886] 写篇文章不容易,点个赞再走吧,求求了~  目   录 网络访问-思维导图 玩Android网站---查看登录Cookie 适配器 ...

  3. java外部接口图解_java代码实现访问网络外部接口并获取数据的工具类详解

    java代码实现访问网络外部接口并获取数据的工具类 工具类代码,可以直接copy使用 package com.yqzj.util; import org.apache.log4j.LogManager ...

  4. Android 8.0学习(32)---Android 8.0源码目录结构详解

    Android 8.0源码目录结构详解 android的移植按如下流程:     (1)android linux 内核的普通驱动移植,让内核可以在目标平台上运行起来.     (2)正确挂载文件系统 ...

  5. Dockerfile详解、镜像发布、网络详解学习

    一.DockerFile 1.Docker介绍 Dockerfile是用来构建Docker镜像的文件是命令参数脚本.docker build命令用于从Dockerfile构建镜像.可以在docker ...

  6. Android 各大厂面试题汇总与详解(持续更新)

    介绍 目前网络中出现了好多各种面试题的汇总,有真实的也有虚假的,所以今年我将会汇总各大公司面试比较常见的问题,逐一进行解答.会一直集成,也会收集大家提供的面试题,如有错误,请大家指出,经过排查存在,会 ...

  7. openstack 网络详解(Essex版)

     openstack网络详解 本博客欢迎转发,但请保留原作者信息(@孔令贤HW)!内容系本人学习.研究和总结,如有雷同,实属荣幸! 这篇文章基本是参考了http://www.mirantis.co ...

  8. linux配置网络详解

    linux配置网络详解 文章目录 linux配置网络详解 前置准备 配置流程 错误排查 前置准备 确定是否有网,比如在家里,确定是否连上网线?确定这个网线的网关是什么?(这个需要和给你办网的人确定), ...

  9. 《微信小程序》 数据访问实例详解

    如图所示 1.每个视图(.wxml)只需要添加对应名字的脚本(.js)和样式(.wxss)就可以了,不需要引用,page下面的脚本以及样式都是继承至最外面的app.js , app.wxcss 2.脚 ...

最新文章

  1. Java项目:后台管理系统脚手架项目(java+SpringBoot+FreeMarker+mysql+JSP)
  2. Web网页布局的主要方式
  3. 本地不安装Oracle,plsql远程连接数据库
  4. 把字符串3,1,2,4以,分割拆分为数组,数组元素并按从小到大的顺序排列
  5. mysql 查询 集合_MySQL使用集合函数进行查询操作实例详解
  6. Ubuntu14.04 下截图工具与设置快捷键
  7. php导入excel文件 视频,PHP导入Excel文件
  8. 《EMCAScript6入门》读书笔记——2.let和const命令
  9. python输出字符_python输出字符
  10. Valid Palindrome leetcode125
  11. vim如何删除^M字符
  12. Reza Zafarani经典教材-《社交媒体挖掘》PDF+随书课件打包分享
  13. 使用HttpClient和OkHttp实现模拟登录方正教务系统
  14. 文献阅读(03)Computing Graph Neural Networks: A Survey from Algorithms to Accelerators
  15. 普通卷积、分组卷积和深度分离卷积概念以及参数量计算
  16. 中国移动云能力中心IaaS产品部2021年招聘
  17. 计算机学业水平测试初中生操作题,初中学业水平考试信息技术考试操作题常见题型及作答方法...
  18. Hololens2画面传输到电脑上的方法(Hololens2录视频下载方法)
  19. 开机提示:one of your disks needs to be checked解决方法
  20. MATLAB实现k-means算法(k-均值)对无标签数据进行聚类,并通过肘部法则确定聚类类别

热门文章

  1. replace into mysql去重_上传 phpexcel 类 入库并入库前去重
  2. mysql 创建临时表 时间类型_MySQL问答系列之什么情况下会用到临时表
  3. 单相桥式相控整流电路multisim仿真_单相半波可控整流电路电阻负载的Matlab Simulink仿真...
  4. 最后一篇,小白看的Python基础教程,详细得很(十一)
  5. 梦世界服务器修改指令,我的世界梦世界有哪些指令必须知道 梦世界所有必须知道指令汇总...
  6. ​EMNLP 2021 最新综述:语言模型中的关系性知识
  7. 仅输入单张图片,就能“看”出物体材质!这篇图形学论文已被SIGGRAPH 2021收录...
  8. 你可能不需要固定词表:一种与词表无关的组合式词向量方法
  9. AAAI 2020 | NAS+目标检测:AI设计的目标检测模型长啥样?
  10. 路痴的单身小菡 BFS求最短路径+DFS求路径数