使用HttpURLConnection从网络获取数据
- 从网络获取数据的过程为:HttpURLConnection与网络建立连接->InputStream获取输入流(二进制)->InputStreamReader加工包装注入BufferedReader数据”蓄水池“->从蓄水池读取String字符串->StringBulider将字符串拼接->字符串输出到客户端
- 网络请求需要权限,因此需要在Manifest里面添加这行语句
<user-permission android:name="android.permission.INTTERNET"/>
- 可以建立一个Package来放置这个网络请求的方法,然后再创建一个类将其命名为NetUtil
public class NetUtil{
public static String doGet(){
BufferedReader reader = null;
String bookHSONString = null;
try{
//1.HttpURLConnection建立连接
HttpURLConnection httpURLConnection = null;
String url="https://www.baidu.com";
URL requestUrl = new URL(url);
httpURLConnection = (HttpURLConnection)requestUrl.openconnection();//打开连接
httpURLConnection.setRequestMethod("GET");//两种方法GET/POST
httpURLConnection.setConnectionTimeout(5000);//设置超时连接时间
httpURLConnection.connect();
//2.InputStream获取二进制流
InputStream inputstream = httpURLConnection.getInputStream();
//3.InputStreamReader将二进制流进行包装成BufferedReader
reader = new BufferedReader(new InputStreamReader(inputStream));
//4.从BufferedReader中读取String字符串,用StringBulider接收
StringBulider bulider = new StringBulider();
String line;
while((line=reader.readLine())!=null){
bulider.append(line);
bulider.append("\n");
}
if(bulider.length()==0)
{
return null;
}
//5.StringBulider将字符串进行拼接
bookJSONString = bulider.toString();
}catch(MalformedURLException e){
e.printStackTrace();
}
return bookJSONString;
}
}
MainActivity.java程序将上一篇文章所写的假装从网络上获取字符串,改为真正从网络上获取字符串
public class MainActivity extends AppCompatActivity{
private TextView tvContent;
//此处写一个handler程序
private Handler mHandler = new Handler(Looper.myLooper()){
@Override
public void handleMessage(@NonNull Message msg){
super.handlerMessage(msg);
if(msg.what==0){
String strData = (String)msg.obj;
tvContent.setText(strData);
Toast.makeText(MainActivity.this,"主线程收到网络消息了!",Toast.LENGTH_SHORT).show();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvContent = findViewById(R.id.tv_content);
}
public void start(View view){
//做一个耗时任务
new Thread(new Runnable(){
@Override
public void run(){
String stringFormNet = getStringFormNet();
//使用handler来发送消息
Message message = new Message();
message.what = 0;//用于区分是谁发的消息
message.obj = stringFormNet;
mHandler.sendMessage(meaasge);
}
}).start();
Toast.makeText(MainActivity.this,"开启子线程请求网络!",Toast.LENGTH_SHORT).show();
}
private String getStringFormNet(){
//从网络上获取字符串
return NetUtil.doGet();
}
}