【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();
}
}
输出为: