单读学习-启动页

启动的时候会有一个启动页的动画,并且首次的时候会下载启动页的图片到本地

image

创建SplashActivity.java,记得在AndroidManifest.xml中注册

源码

状态栏

private void initStatus() {
    if (Build.VERSION.SDK_INT >= 21) {
        View decorView = getWindow().getDecorView();
        int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
        decorView.setSystemUiVisibility(option);
        getWindow().setStatusBarColor(Color.TRANSPARENT);
    }
}       

注入SplashPresenter

设计接口

创建接口类 SplashContract.java

两个接口

  1. Presenter 接口中的getSplash方法是获取数据处理数据的
  2. View接口是为了提供View的
public interface SplashContract {

    interface Presenter {
        void getSplash(String deviceId);
    }

    interface View{}
}

创建SplashPresenter

这部分是真实的网络请求,处理数据的部分

创建SplashPresenter.java,实现SplashContract.Presenter接口。如下

public class SplashPresenter implements SplashContract.Presenter{

    private SplashContract.View view;
    private ApiService apiService;

    @Inject
    public SplashPresenter(SplashContract.View view, ApiService apiService) {
        this.view = view;
        this.apiService = apiService;
    }

    @Override
    public void getSplash(String deviceId) {
        
    }

}

接下来,我们需要在上面的getSplash中请求数据,这部分代码我们后面实现

创建SplashModule

  • @Module 注解标注
  • @Provides注解标注,这些方法就是所提供的依赖,Dagger2 会在该类中寻找实例化某个类所需要的依赖。
@Module
public class SplashModule {

    private SplashContract.View view;

    public SplashModule(SplashContract.View view) {
        this.view = view;
    }

    @Provides
    public SplashContract.View provideView(){
        return view;
    }
}

创建SplashComponent

  • module是SplashModule.class
  • 还需要依赖网络的Component
  • @UserScope 网上说是和生命周期绑定
@UserScope
@Component (modules = SplashModule.class,dependencies = NetComponent.class)
public interface SplashComponent {

    void inject(SplashActivity splashActivity);

}

UserScope.java 类代码如下

@Scope
public @interface UserScope {
}

Make Project

完成之后 **apt **会自动生成一个 以 Dagger 开头的 Component,此处,我们上面写的是 SplashComponent,生成了类名就为 DaggerSplashComponent,这个类我们可以直接使用

使用

此时,就注入了 SplashPresenter

DaggerSplashComponent.builder()
        .netComponent(MyApplication.getInstance().getNetComponent())
        .splashModule(new SplashModule(this))
        .build()
        .inject(this);

完整代码

上述都是在onCreate中实现的

public class SplashActivity extends BaseActivity implements SplashContract.View,EasyPermissions.PermissionCallbacks{

  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

      DaggerSplashComponent.builder()
        .netComponent(MyApplication.getInstance().getNetComponent())
        .splashModule(new SplashModule(this))
        .build()
        .inject(this);

      initStatus();
    }
  }

数据请求处理

注入SplashPresenter之后,就需要用它来请求数据了

在ApiService创建网络请求

这部分代码在上一篇中已经介绍过了,不再详述

public interface ApiService {
   @GET("static/picture_list.txt")
    Observable<SplashEntity> getSplash(@Query("client") String client,@Query("version") String          version,@Query("time") Long time,@Query("device_id") String deviceId);

}

数据处理并缓存

Long time = TimeUtil.getCurrentSeconds();
apiService.getSplash("android","1.3.0",time,deviceId)
        .subscribeOn(Schedulers.io())
        .observeOn(Schedulers.io())
        .subscribe(new Subscriber<SplashEntity>() {
            @Override
            public void onCompleted() {
                Logger.e("load splash onCompleted");
            }

            @Override
            public void onError(Throwable e) {
                Logger.e("load splash Error"+e.toString());
            }

            @Override
            public void onNext(SplashEntity splashEntity) {
              //判断是不是wifi环境
                if (NetUtil.isWifi(MyApplication.getInstance().getApplicationContext())) {
                    if (splashEntity != null){
                        List<String> urlist = splashEntity.getImages();
                      //拿到url之后下载图片数据
                        for (String url:urlist) {
                            OkHttpImageDownloader.download(url);
                        }
                    }
                }else {
                    Logger.d("不是WIFI环境,不下载图片");
                }
            }
        });

创建文件保存启动页

这部分就是文件的处理,有一些文件处理的方法参考文章下面附录中的 FileUtils.java

public class OkHttpImageDownloader {
    public static void download(String url){
        Request request = new Request.Builder().url(url).build();
        HttpUtils.client.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                Logger.d(e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                FileUtils.createSdDir();
                String url = response.request().url().toString();
                int index = url.lastIndexOf("/");
                String pictureName = url.substring(index+1);
                if(FileUtils.isFileExist(pictureName)){
                    return;
                }
                Logger.i("pictureName="+pictureName);
                FileOutputStream fos = new FileOutputStream(FileUtils.createFile(pictureName));
                InputStream in = response.body().byteStream();
                byte[] buf = new byte[1024];
                int len = 0;
                while ((len = in.read(buf))!=-1){
                    fos.write(buf,0,len);
                }
                fos.flush();
                in.close();
                fos.close();
            }
        });
    }
}

展示启动页图片

在展示之前需要做一些权限的处理,参考一下源码吧,这里就不写了

首先调用网络请求方法 ,在数据请求之后,在Oncreate中或者onStart中都可以调用

//只需要这一行代码就可以完成数据的请求
presenter.getSplash(deviceId);

完成数据请求之后,展示图片,会从缓存中的图片中随机出来一张图片做展示,原来的代码中还会判断上一次展示的图片序号,确保本次和上一次展示的图片不一样,我删掉了这部分代码。

private void delaySplash() {
    List<String> picList = FileUtils.getAllAD();

    if (picList.size() > 0) {
        int index = new Random().nextInt(picList.size());
        Logger.d("tuionf","----index---"+index);
        File file = new File(picList.get(index));
        InputStream fis = null;
        try {
            fis = new FileInputStream(file);
            splashImg.setImageDrawable(InputStream2Drawable(fis));
            animWelcomeImage();
            fis.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }else {
        try {
            AssetManager am = this.getAssets();
            InputStream is = am.open("welcome_default.jpg");
            splashImg.setImageDrawable(InputStream2Drawable(is));
            animWelcomeImage();
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

源码与附录

源码

SplashActivity.java

布局文件 activity_splash.xml

FileUtils.java工具类

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,923评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,154评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,775评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,960评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,976评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,972评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,893评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,709评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,159评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,400评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,552评论 1 346
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,265评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,876评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,528评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,701评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,552评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,451评论 2 352