【Monica的android学习之路】android的网络请求

【Monica的android学习之路】android的网络请求

1.一个基本的网页请求

(1)在manifest中声明网络权限

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

(2)完成网络请求
这里在线程池中访问了百度主页,并用Handler把结果显示在页面上

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "monica";
    private static TextView web;

    @SuppressLint("HandlerLeak")
    private Handler handler = new Handler() {
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what) {
                case 1:
                    web.setText(msg.obj.toString());
                    break;
                default:
                    web.setText(new String("msg error"));
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.i(TAG, "onCreate activity");

        setContentView(R.layout.activity_main);
        web = findViewById(R.id.web);
        ThreadPoolExecutor executor = new ThreadPoolExecutor(2, 4, 10L,
                TimeUnit.MILLISECONDS, new LinkedBlockingQueue<>(2));        //初始化线程池
        executor.execute(new Runnable() {        //提交一个异步任务
            @Override
            public void run() {
                URL url;
                BufferedReader bufferedReader = null;
                InputStreamReader inputStreamReader = null;
                HttpURLConnection conn = null;
                try {
                    url = new URL("https://www.baidu.com");     //访问百度首页
                    conn = (HttpURLConnection) url.openConnection();
                    conn.setRequestMethod("GET");    //设置请求方式
                    conn.setDoInput(true);
                    conn.setConnectTimeout(1000);    //设置连接超时时间
                    conn.setReadTimeout(1000);       //设置读取超时时间
                    inputStreamReader = new InputStreamReader(conn.getInputStream());
                    bufferedReader = new BufferedReader(inputStreamReader);
                    StringBuilder stringBuilder = new StringBuilder(16);   //默认初始容量为16,不足时自动扩容
                    String tmpLine;
                    Log.e(TAG, "begin readLine");

                    while ((tmpLine = bufferedReader.readLine()) != null) {         //按行读取,直至结束
                        stringBuilder.append(tmpLine + System.lineSeparator());
                        if (stringBuilder.length() > 200) {          //添加对读取长度的显示,以免内存不足
                            stringBuilder = new StringBuilder(stringBuilder.substring(0, stringBuilder.length() - tmpLine.length()));
                            Log.i(TAG, "too long, length: " + stringBuilder.length());
                            break;
                        }
                    }
                    Log.e(TAG, "stringBuilder: " + stringBuilder);     //输出读取结果
                    Message msg = new Message();
                    msg.what = 1;
                    msg.obj = stringBuilder.toString();
                    handler.sendMessage(msg);          //用handler更新UI
                } catch (IOException e) {
                    Log.i(TAG, "IOException");
                } finally {                          //finally中释放资源
                    closeStream(bufferedReader);
                    closeStream(inputStreamReader);
                    closeStream(conn);
                }
            }
        });
    }

    private <T> void closeStream(T stream) {        //使用泛型统一资源释放函数
        try {
            if (stream instanceof BufferedReader) {
                ((BufferedReader) stream).close();
                Log.e(TAG, "BufferedReader close");
            } else if (stream instanceof InputStreamReader) {
                ((InputStreamReader) stream).close();
                Log.e(TAG, "InputStreamReader close");
            } else if (stream instanceof HttpURLConnection) {
                ((HttpURLConnection) stream).disconnect();
                Log.e(TAG, "HttpURLConnection close");
            } else {
                Log.e(TAG, "Class not found exception");
            }
        } catch (IOException e) {
            Log.i(TAG, "IOException");
        }

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

输出为:
在这里插入图片描述

2.网页请求相关类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值