鱼C论坛

 找回密码
 立即注册
查看: 2962|回复: 0

[技术交流] kotlin for android 之 用手机爬取网站源码

[复制链接]
发表于 2017-11-28 11:28:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        网络这方面比较复杂,但是我身为网络版的版主也得讲啊 。咱们先从简单的来。从新建个项目,修改AndroidManifest.xml文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.     package="com.example.xinwei.httpproject">
  4. <uses-permission android:name="android.permission.INTERNET"/>
  5.     <application
  6.         android:allowBackup="true"
  7.         android:icon="@mipmap/ic_launcher"
  8.         android:label="@string/app_name"
  9.         android:roundIcon="@mipmap/ic_launcher_round"
  10.         android:supportsRtl="true"
  11.         android:theme="@style/AppTheme">
  12.         <activity android:name=".MainActivity">
  13.             <intent-filter>
  14.                 <action android:name="android.intent.action.MAIN" />

  15.                 <category android:name="android.intent.category.LAUNCHER" />
  16.             </intent-filter>
  17.         </activity>
  18.     </application>

  19. </manifest>
复制代码

其实只加了一行<uses-permission android:name="android.permission.INTERNET"/>给我们的手机使用网络授权。然后修改activity_main.xml文件:
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:orientation="vertical"
  4.     xmlns:tools="http://schemas.android.com/tools"
  5.     android:layout_width="match_parent"
  6.     android:layout_height="match_parent"
  7.     tools:context="com.example.xinwei.httpproject.MainActivity">

  8.     <ScrollView
  9.     android:layout_width="wrap_content"
  10.     android:layout_height="wrap_content">
  11.         <TextView
  12.         android:id="@+id/idtext"
  13.         android:layout_width="wrap_content"
  14.         android:layout_height="wrap_content"
  15.         android:text="Waiting download..."
  16.         android:layout_gravity="center"
  17.         />
  18.     </ScrollView>

  19.     <ProgressBar
  20.         android:id="@+id/idprogress"
  21.         android:layout_width="wrap_content"
  22.         android:layout_height="wrap_content"
  23.         android:layout_gravity="center"/>

  24. </LinearLayout>
复制代码

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

  2. import android.annotation.SuppressLint
  3. import android.os.AsyncTask
  4. import android.support.v7.app.AppCompatActivity
  5. import android.os.Bundle
  6. import android.util.Log
  7. import kotlinx.android.synthetic.main.activity_main.*
  8. import java.io.BufferedReader
  9. import java.io.InputStream
  10. import java.io.InputStreamReader
  11. import java.net.HttpURLConnection
  12. import java.net.URL

  13. class MainActivity : AppCompatActivity() {

  14.     override fun onCreate(savedInstanceState: Bundle?) {
  15.         super.onCreate(savedInstanceState)
  16.         setContentView(R.layout.activity_main)
  17.         getInternetData()
  18.     }
  19.     fun getInternetData(){
  20.         val url="http://www.fishc.com"
  21.         val myAsyncTask=MyAsyncTask()
  22.         myAsyncTask.execute(url)
  23.     }
  24.     @SuppressLint("StaticFieldLeak")
  25.     inner class MyAsyncTask : AsyncTask<String, String, String>() {

  26.         override fun onProgressUpdate(vararg values: String?) {
  27.             super.onProgressUpdate(*values)
  28.             if (values[0]!!.isNotEmpty()) {
  29.                 idprogress.invalidate()
  30.             }
  31.         }

  32.         override fun doInBackground(vararg p0: String?):String {
  33.             try {
  34.                 val url=URL(p0[0])
  35.                 val urlConnect=url.openConnection() as HttpURLConnection
  36.                 urlConnect.connectTimeout=7000
  37.                 urlConnect.requestMethod="GET"
  38.                 urlConnect.readTimeout=7000
  39.                 var inString=convertToString(urlConnect.inputStream)
  40.                 publishProgress(inString)
  41.                 urlConnect.disconnect()
  42.                 return inString
  43.             }catch (e:Exception){
  44.                 e.printStackTrace()
  45.             }
  46.             return "网站连接失败"
  47.         }

  48.         private fun convertToString(inputStream: InputStream?): String {
  49.             var bufferedReader=BufferedReader(InputStreamReader(inputStream))
  50.             var allString=StringBuilder()
  51.             bufferedReader.forEachLine {
  52.                 allString.append(it)
  53.             }
  54.             bufferedReader.close()
  55.             inputStream?.close()
  56.             return allString.toString()
  57.         }

  58.         override fun onPostExecute(result: String?) {
  59.             super.onPostExecute(result)
  60.             idtext.text=result
  61.         }
  62.     }
  63. }
复制代码

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

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-19 19:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表