第五周总结

  本周实现爬取的数据通过APP进行展示,需要用到的东西:web结构(servlet),Android,服务器,使用python爬取数据

  服务器搭建我选择的是阿里云的云服务器,web和python方面之前已经学习过了,这里介绍Android上我学习的知识:HttpURLConnection

  1 package com.example.yiqing;
  2 
  3 import androidx.appcompat.app.AppCompatActivity;
  4 
  5 import android.content.Intent;
  6 import android.os.Bundle;
  7 import android.os.Handler;
  8 import android.os.Message;
  9 import android.text.method.ScrollingMovementMethod;
 10 import android.view.View;
 11 import android.widget.Button;
 12 import android.widget.TextView;
 13 
 14 import org.json.JSONArray;
 15 import org.json.JSONObject;
 16 
 17 import java.io.BufferedReader;
 18 import java.io.DataOutputStream;
 19 import java.io.IOException;
 20 import java.io.InputStreamReader;
 21 import java.io.OutputStream;
 22 import java.net.HttpURLConnection;
 23 import java.net.URL;
 24 import java.net.URLEncoder;
 25 
 26 public class Watch extends AppCompatActivity {
 27     private TextView show;
 28     private Button see;
 29 
 30     //利用Handler实现更改页面
 31     private Handler handler=new Handler(){
 32         public void handleMessage(android.os.Message msg){
 33             Bundle bundle=new Bundle();
 34             bundle=msg.getData();
 35             String ans=bundle.getString("result");
 36             if(ans!=null){
 37                 show.setText(ans);
 38             }
 39         }
 40     };
 41     @Override
 42     protected void onCreate(Bundle savedInstanceState) {
 43         super.onCreate(savedInstanceState);
 44         setContentView(R.layout.activity_watch);
 45         show=(TextView)findViewById(R.id.show);
 46         show.setMovementMethod(ScrollingMovementMethod.getInstance());
 47         see=(Button)findViewById(R.id.see);
 48 
 49         see.setOnClickListener(new View.OnClickListener(){
 50             @Override
 51             public void onClick(View view){
 52                 //写下要访问的servlet路径
 53                 final String path="http://47.98.228.220:8080/PaQu/ChartServlet";
 54                 //使用HttpURLConnection需要子线程
 55                 new Thread(new Runnable() {
 56                     @Override
 57                     public void run() {
 58                         Intent intentdata=getIntent();
 59                         //从上一个页面拿到输入的日期数据
 60                         String date=intentdata.getStringExtra("date");
 61                         String msg="";
 62                         HttpURLConnection conn=null;
 63                         try{
 64                             URL url=new URL(path);
 65                             conn=(HttpURLConnection)url.openConnection();
 66                             //设置post格式,这里格式要跟servlet里一致
 67                             conn.setRequestMethod("POST");
 68                             //设置超时时间
 69                             conn.setConnectTimeout(5000);
 70                             conn.setReadTimeout(5000);
 71                             //post格式不能用缓存
 72                             conn.setUseCaches(false);
 73                             conn.setDoInput(true);
 74                             String data="date="+date;
 75                             //将传给servlet的数据写入传输
 76                             OutputStream out=conn.getOutputStream();
 77                             //这里注意要更改传输数据的格式,getBytes()
 78                             out.write(data.getBytes());
 79                             out.flush();
 80                             out.close();
 81                             conn.connect();
 82 
 83                             //这里开始接收从servlet里传回来的数据
 84                             BufferedReader reader=new BufferedReader(new InputStreamReader(conn.getInputStream()));
 85                             String line=null;
 86                             //传回来的是一个JSONArray类型的数据,需要对其进行解析
 87                             if((line=reader.readLine())!=null){
 88                                 //开始解析
 89                                 JSONArray jsonArray=new JSONArray(line);
 90                                 for(int i=0;i<jsonArray.length();i++){
 91                                     JSONObject jsonObject=jsonArray.getJSONObject(i);
 92                                     String province=jsonObject.getString("Province");
 93                                     String confirmed=jsonObject.getString("Confirmed");
 94                                     String cured=jsonObject.getString("Cured");
 95                                     String dead=jsonObject.getString("Dead");
 96                                     msg=msg+"省份:"+province+"     确诊:"+confirmed+"     治愈:"+cured+"     死亡:"+dead+"
";
 97                                 }
 98                             }
 99                             //将信息使用bundle封装,传给handler
100                             Bundle bundle=new Bundle();
101                             bundle.putString("result",msg);
102                             Message msg1=new Message();
103                             msg1.setData(bundle);
104                             handler.sendMessage(msg1);
105                             conn.disconnect();
106                         }catch(Exception e){
107                             e.printStackTrace();
108                         }
109                     }
110                 }).start();
111             }
112         });
113     }
114 
115 }

HttpURLConnection能够连接到servlet,需要先给Android设置网络连接权限。爬取到数据是Servlet回传的数据,这里可以看到我servlet回调的是json数据。最后就是更改页面控件显示。因为主线程上不允许调用页面更改,因此需要handle另起线程实现。

原文地址:https://www.cnblogs.com/20183711PYD/p/13059237.html