alltolove 发表于 2017-11-28 11:28:10

kotlin for android 之 用手机爬取网站源码

        网络这方面比较复杂,但是我身为网络版的版主也得讲啊{:5_92:} 。咱们先从简单的来。从新建个项目,修改AndroidManifest.xml文件<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.xinwei.httpproject">
<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>
其实只加了一行<uses-permission android:name="android.permission.INTERNET"/>给我们的手机使用网络授权。然后修改activity_main.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.xinwei.httpproject.MainActivity">

    <ScrollView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
      <TextView
      android:id="@+id/idtext"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Waiting download..."
      android:layout_gravity="center"
      />
    </ScrollView>

    <ProgressBar
      android:id="@+id/idprogress"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center"/>

</LinearLayout>

        新学两个控件,ScrollView跟ProgressBar,作用分别是让屏幕可以滚动和进度条的功能。然后修改MainActivity.kt
package com.example.xinwei.httpproject

import android.annotation.SuppressLint
import android.os.AsyncTask
import android.support.v7.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import kotlinx.android.synthetic.main.activity_main.*
import java.io.BufferedReader
import java.io.InputStream
import java.io.InputStreamReader
import java.net.HttpURLConnection
import java.net.URL

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
      super.onCreate(savedInstanceState)
      setContentView(R.layout.activity_main)
      getInternetData()
    }
    fun getInternetData(){
      val url="http://www.fishc.com"
      val myAsyncTask=MyAsyncTask()
      myAsyncTask.execute(url)
    }
    @SuppressLint("StaticFieldLeak")
    inner class MyAsyncTask : AsyncTask<String, String, String>() {

      override fun onProgressUpdate(vararg values: String?) {
            super.onProgressUpdate(*values)
            if (values!!.isNotEmpty()) {
                idprogress.invalidate()
            }
      }

      override fun doInBackground(vararg p0: String?):String {
            try {
                val url=URL(p0)
                val urlConnect=url.openConnection() as HttpURLConnection
                urlConnect.connectTimeout=7000
                urlConnect.requestMethod="GET"
                urlConnect.readTimeout=7000
                var inString=convertToString(urlConnect.inputStream)
                publishProgress(inString)
                urlConnect.disconnect()
                return inString
            }catch (e:Exception){
                e.printStackTrace()
            }
            return "网站连接失败"
      }

      private fun convertToString(inputStream: InputStream?): String {
            var bufferedReader=BufferedReader(InputStreamReader(inputStream))
            var allString=StringBuilder()
            bufferedReader.forEachLine {
                allString.append(it)
            }
            bufferedReader.close()
            inputStream?.close()
            return allString.toString()
      }

      override fun onPostExecute(result: String?) {
            super.onPostExecute(result)
            idtext.text=result
      }
    }
}

        这里我们写了个getInternetData方法和一个MyAsyncTask的内部类。网络因为是耗时操作所以android要求必须在这个继承了AsyncTask抽象类的类里完成,也没什么难的,这都是固定写法,调用的时候就传一个网址进去就行了。我在这个类里复写的onProgressUpdate方法里更新了进度条,然以后在onPostExecute这个方法里把从网上获取的数据放进textview控件。从网上下载数据主要是从doInBackground方法里,我获取到网上的输入流,然后通过convertToString我自己写的这个方法转化成字符串。因为网页上数据太长了所以放进textview里会丢失一些数据,一般我们不会把源代码全放进textview里这样的,这只是做个演示。效果图:

页: [1]
查看完整版本: kotlin for android 之 用手机爬取网站源码