{
    分享网正式开通,我们为大家提供免费资源,欢迎大家踊跃投稿!

Android上福利满满的应用,宅男神器美女图库

果肉一款福利满满的app,数据源mzitu,MD风格的界面

如果你是一位想学习一下科特林的同学,那么绝对不要错过肉。如科特林所说它与Java的完美兼容,所以这里有科特林调用Java的,同时也有Java的调用科特林。数据是从网站上爬取的所以这里也有爬虫骚操作。果肉将会不定期更新,增加更多福利。

国际惯例,先上福利。Release1.0

特点

  1. 列表显示图片,点击查看更多。
  2. 快速跳转至顶部,底部,指定位置。
  3. 收藏,查看历史记录。
  4. 设置壁纸。
  5. 离线缓存。

组成

  1. 语言:科特林,爪哇
  2. 网络请求:HttpURLConnection的
  3. 数据库:sqlite的
  4. 数据源:Jsoup
  5. 第三方库:滑翔

概述

1)网络请求

网络框架并没有使用RxRetrofit等,为了保证精简高效直接使用的HttpURLConnection类

  • 得到
val  request  = AsyncNetwork()
请求请求(常量HOST_MOBILE_URLnull)
请求setRequestCallback(object  IRequestCallback {
     override  fun  onSuccesshttpURLConnection  HttpURLConnection?,response  String){
         //待办事项
    }
})
  • 岗位
val  request  = AsyncNetwork()
请求请求(常量HOST_MOBILE_URL,mutableMapOf())
请求setRequestCallback(object  IRequestCallback {
     override  fun  onSuccesshttpURLConnection  HttpURLConnection?,response  String){
         //待办事项
    }
})

2)数据库

数据库没有使用第三方框架,直接使用的SQL语句。

CREATE  TABLE  tb_class_page_list(
                    _id            INTEGER  PRIMARY KEY  ASC AUTOINCREMENT,
                    href STRING独特,
                    说明STRING,
                    image_url STRING,
                    id_class_page INTEGER  REFERENCES tb_class_page(_id)ON DELETE CASCADE  ON  UPDATE CASCADE,
                    [index]        INTEGER);

3)读写缓存

序列化的效率远低于Parcelable,所以采用Parcelable实现的缓存机制,速度快了大概7,8倍。

  • 读取缓存
VAL  助手 = PageListCacheHelper(?容器?上下文?FILESDIR  absolutePath)
 VAL  pageModel  不限=帮手得到(钥匙)
  • 写入缓存
VAL  助手 = PageListCacheHelper(上下文 FILESDIR  absolutePath)
帮手把(钥匙,对象)
  • 删除缓存
VAL  助手 = PageListCacheHelper(上下文 FILESDIR  absolutePath)
帮手删除(钥匙)

4) jsoup获取数据

由于数据是用从HTML页面中提取的,所以速度偏慢,为了不影响体验做了一套缓存机制,来做到流畅体验。

Document doc =  Jsoup 解析(HTML);
元素元素=正文getElementsByTag( a );
字符串文本=元素得到(0文本();
String imageUrl =元素得到(0attr( src );
...

5)组件

  • 活动片段替代活动来显示新界面

    因为活动需要在Manifiest中注册,所以当有多个活动的时候,就需要编写很长的Manifiest文件,严重影响了Manifiest的可读性,界面的风格也比较笨重。所以一个新页面就注册一个活动不太合适,我们通过用活性做为容器添加不同的片段来达到注册一个活动启动多个不同页面的效果。生命周期由活动管理,更方便简洁。

    打开BaseFragmentActivity   BaseActionActivity(){
    
        伴侣对象{
    
            private  const  val  EXTRA_FRAGMENT_NAME  =   extra_fragment_name 
             private  const  val  EXTRA_FRAGMENT_ARG  =   extra_fragment_arguments 
    
            @JvmOverloads
            @JvmStatic
            有趣的 newInstance上下文上下文,片段 Class < * >,bundle  Bundle?=  nullclazz  Class < out Activity> = getActivityClazz()) Intent {
                 val  intent  = Intent(context,clazz)
                意图putExtra(EXTRA_FRAGMENT_NAME,片段名)
                意图putExtra(EXTRA_FRAGMENT_ARG,包)
                 返回意图
            }
    
            保护的 开放 乐趣 getActivityClazz() 类< 活动> {
                 返回 BaseFragmentActivity ::类。java的
            }
        }
    
        重写 fun  onCreatesavedInstanceState  Bundle?){
             super 的onCreate(savedInstanceState)
            的setContentView(R 布局 cc_activity_base_fragment)
             VAL  fragmentName  =意图getStringExtra(EXTRA_FRAGMENT_NAMEvar  fragment  Fragment?=  
            ,如果(文本实用程序的isEmpty(fragmentName)){
                 //组默认片段
                //片段= makeFragment(MainFragment :: class.java !!的getName()) 
            } 否则 {
                 VAL  ARGS  =意图getBundleExtra(EXTRA_FRAGMENT_ARG试试 {
                    fragment = makeFragment(fragmentName)
                     if(args !=  null)
                        分段?arguments = args
                } 捕获(E 异常){
                    e 的printStackTrace()
                }
    
            }
    
            如果(fragment ==  null返回
    
            supportFragmentManager
                    beginTransaction()
                     替换(R  ID  fragment_container,片段)
                     承诺()
        }
    
        有趣的 makeFragment名称 字符串片段?{
             try {
                 val  fragmentClazz  = Class forName(name)
                 返回 fragmentClazz newInstance()作为片段
            } 捕获(E 异常){
                e 的printStackTrace()
            }
    
            返回 null
        }
    
    }

6)序列化性能

性能测试,Serializable VS Externalizable,为了避免干扰,我们使用AndroidTest进行测试。

模型

 Model1  实现 Serializable {
     String text;
    int code;
    布尔布尔;
    Model1儿童;
}

 Model2  扩展 Model1  实现 Externalizable {

    public  Model2(){
    }

    @Override 
    public  void  readExternalObjectInput  inputthrows  IOExceptionClassNotFoundException {
        文本=输入的readUTF();
        代码=输入的readInt();
        bool =输入readBoolean();

        child =  new  Model2();
        孩子文本=输入的readUTF();
        孩子代码=输入的readInt();
        孩子bool =输入readBoolean();
    }

    @Override 
    public  void  writeExternalObjectOutput  outputthrows  IOException {
        输出writeUTF(文本);
        输出writeInt(代码);
        输出writeBoolean(布尔);
        if(child !=  null){
            输出writeUTF(孩子文本);
            输出writeInt(孩子代码);
            输出writeBoolean(孩子布尔);
        }
    }
}

测试

@Test 
public  void serializableVSExternalizable()throws Exception {
     List < Model1 > testModel1 =  new  ArrayList <>();
    forint i =  0 ; i <  50000 ; i ++){
         Model1 model1 =  new  Model1();
        model1 text =   Hello World   + i;
        model1 code = i;
        model1 bool =  false ;

        Model1 child =  new  Model1();
        孩子text =   Hello World Child   + i;
        孩子code = i;
        孩子bool =  false ;

        model1 孩子=孩子;
        testModel1 添加(MODEL1);
    }
    long startTime =  System 的currentTimeMillis();
    File file =  new  File / sdcard / serializable );
    ObjectOutputStream oStream =  new  ObjectOutputStreamnew  FileOutputStream(file));
    OStream 的writeObject(testModel1);
    OStream 关();
    日志E( 串行化写入时间  +系统的currentTimeMillis()-开始时间));
    startTime =  System 的currentTimeMillis();
    ObjectInputStream iStream =  new  ObjectInputStreamnew  FileInputStream(file));
    testModel1 =List < Model1 >)iStream 的readObject();
    iStream 关();
    日志E( 串行化

资源均来自第三方,谨慎下载,前往第三方网站下载


爱资源分享网 , 版权所有丨本站资源仅限于学习研究,严禁从事商业或者非法活动!丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Android上福利满满的应用,宅男神器美女图库
喜欢 ()分享 (0)