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">

    <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打开文章,进行阅读。

猜你喜欢

转载自blog.csdn.net/weixin_44949135/article/details/106161504