Fragment 知识梳理, FragmentPagerAdapter ,RecyclerView 知识梳理,sharepreference,IntentSer

简介: Fragment 知识梳理, FragmentPagerAdapter ,RecyclerView 知识梳理,sharepreference,IntentSer

Fragment:



会保存左右各一个界面,采用栈存储信息,page1234,从2开始滑动到3,会删除1,添加4,从OnCreateview开始OnDestoryView结束。第一次添加会从生命周期开始走,OnCreate。


三种情况


  • 第一次添加
  • 重新添加
  • 移除


此时,它们内部的Fragment所走的生命周期为:


image.png

RecyclerView 知识梳理:www.jianshu.com/p/21a1384df…



整个RecyclerView体系包含三大组件:

  • LayoutManagerposition the view
  • ItemAnimatoranimate the view
  • Adapterprovide the view


这三大组件各司其职,而RecyclerView负责管理,就组成了整个RecyclerView的架构。


LayoutManager需要负责以下几部分的工作:


  • Position
    它负责View的摆放,可以是线性、宫格、瀑布流式或者任意类型,而RecyclerView不知道也不关心这些,这是LayoutManager的职责。
  • Scroll
    对于滚动事件的处理,RecyclerView负责接收事件,但是最终还是由LayoutManager进行处理滚动后的逻辑,因为只有它在知道View具体摆放的位置。
  • Focus traversal
    当焦点转移导致需要一个新的Item出现在可视区域中时,也是由LayoutManager处理的。


Adapter需要负责以下几部分的工作:



  • 创建ViewViewHolder,后者作为整个复用机制的跟踪单元。
  • 把具体位置的ItemViewHolder进行绑定,并存储相关的信息。
  • 通知RecyclerView数据变化,支持局部的更新,在提高效率的同时也有效地支持了动画。
  • Item点击事件的处理。
  • 多类型布局的支持。


AsyncTask:


  • 静态方法execute(Runnable runnable)AsyncTask其实没什么太大关系,只是用到了里面一个静态的线程池而已,AsyncTask内部的状态都和它无关。
  • 当我们对同一个AsyncTask实例调用execute(..)时,如果此时已经有任务正在执行,或者已经执行过任务,那么会抛出异常。
  • onPreExecute()执行时,任务还没有被加入到队列当中。
  • doInBackground是在子线程当中执行的,我们调用cancel后,并不一定会立即得到onCancel的回调,这是因为cancel只保证了mFuturedone方法被执行,有这么几种情况:
  • 关于AsyncTask最大的问题其实是内存泄漏,因为把它作为Activity的内部类时,会默认持有Activity的引用,那么这时候如果有任务正在执行,那么 Activity 是无法被销毁的,这其实和Handler的泄漏类似,可以有以下这么一些用法:不让它持有Activity的引用或者持有弱引用。        保证在Activity在需要销毁时cancel了所有的任务。      使AsyncTask的执行与Activity的生命周期无关,可以考虑通过建立一个没有UIfragment来实现,因为在Activity重启时,会自动保存有之前add进去的Fragment的实例,Fragment持有的还是先前的 AsyncTask。        使用LoaderManager,把管理的活交给系统来执行。


HandlerThread:www.jianshu.com/p/3d0ebbde4…


就是一个Thread,只不过可以通过它的getLooper返回的Looper作为Handler构造函数的参数,那么这个新建Handler所有message的执行都是在这个对应的Thread当中的.


sharepreference:


获取sp对象,实际就是新建xml文件,之后异步线程进行xml文件读写操作,由于是xml文件因此程序关闭后xml文件仍然存在。持久化存储了。


  • 与某个name所对应的SP对象需要等到调用getSharedPreferences才会被创建
  • 对于同一进程而言,在Activity/Application/Service获取SP对象时,如果name相同,它们实际上获取到的是同一个SP对象
  • 由于使用的是静态容器来保存,因此即使Activity/Service销毁了,它之前创建的SP对象也不会被释放,而SP中的数据又是用Map来保存的,也就是说,我们只要调用了某个name相关联的getSharedPreferences方法,那么和该name对应的xml文件中的数据都会被读到内存当中,并且一直到进程被结束。
  • SP在进程中是实际上是一个单例模式,因此,我们可以做到在进程中的任何地方改变SP的数据,都能收到监听。


IntentService :www.jianshu.com/p/cd85472da…


这是 Service 的子类,它使用工作线程逐一处理所有启动请求。如果您不要求服务同时处理多个请求,这是最好的选择。 您只需实现 onHandleIntent() 方法即可,该方法会接收每个启动请求的 Intent,使您能够执行后台工作。


例子:


public class CustomService extends IntentService {
    private static final String TAG = "CustomService>>>>>>>";
    /**
     * name是命名工作线程的,对debug有帮助
     */
    public CustomService(String name) {
        super(name);
    }
    public CustomService() {
        super("hello");
    }
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
    /**
     * 服务创建时调用,服务正在运行不会调用
     */
    @Override
    public void onCreate() {
        super.onCreate();
        Log.e(TAG, "onCreate: !!!!!!!!!!!!");
    }
    /**
     * 其它组件通过startServer后调用
     */
    @Override
    public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
        Log.e(TAG, "onStartCommand: !!!!!!");
        return super.onStartCommand(intent, flags, startId);
    }
    /**
     * 服务启动时调用
     */
    @Override
    public void onStart(@Nullable Intent intent, int startId) {
        super.onStart(intent, startId);
        Log.e(TAG, "onStart: !!!!!!!!");
    }
    /**
     * 这个方法是在工作线程里执行的
     */
    @Override
    protected void onHandleIntent(@Nullable Intent intent) {
        Log.e(TAG, "onHandleIntent: 当前线程:" + Thread.currentThread().getName());
        for (int i = 0; i < 5; i++) {
            try {
                Thread.sleep(1000);
                System.out.println("服务后台计数:》》" + i);
            } catch (InterruptedException e) {
                e.printStackTrace();
                break;
            }
        }
    }
    /**
     * 服务销毁前的回调
     */
    @Override
    public void onDestroy() {
        super.onDestroy();
        System.out.println("服务已完成!");
    }
}

service交互:startService 下的交互


通过startService启动服务的时候,只能通过onStartCommand当中的Intent进行交互,Service根据Intent中的action区分行为,intent的数据作为输入参数。


这种方式的优点是 简单,缺点是 这种通信方式是单向的,只能由调用者告诉Service做什么,Service无法返回给调用者信息。


public class CommandWorkerService extends Service {
    private static final String TAG = CommandWorkerService.class.getSimpleName();
    public static final String ACTION_LOG = "com.android.action.log";
    public static final String ACTION_KEY_LOG_MSG = "com.android.action.log.msg";
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        handleIntent(intent);
        return super.onStartCommand(intent, flags, startId);
    }
    private void handleIntent(Intent intent) {
        String action = intent.getAction();
        if (!TextUtils.isEmpty(action)) {
            switch (action) {
                case ACTION_LOG:
                    Log.d(TAG, intent.getStringExtra(ACTION_KEY_LOG_MSG));
                    break;
                default:
                    break;
            }
        }
    }
}

调用者的处理方式:


public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        startService();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        stopService();
    }
    private void startService() {
        Intent intent = new Intent(this, CommandWorkerService.class);
        intent.setAction(CommandWorkerService.ACTION_LOG);
        intent.putExtra(CommandWorkerService.ACTION_KEY_LOG_MSG, "Call CommandWorkerService");
        startService(intent);
    }
    private void stopService() {
        Intent intent = new Intent(this, CommandWorkerService.class);
        stopService(intent);
    }
}


目录
相关文章
|
Android开发 前端开发
Android应用开发—RecyclerView绘制蒙层
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/voidreturn/article/details/77718470 背景:如何在跨越两个或两个以上的item绘制一个view,该view需要跟随recyclerView的滑动而整体移动。
1166 0
|
Android开发 开发者
RecyclerView定制:通用ItemDecoration及全展开RecyclerView的实现
RecyclerView定制:通用ItemDecoration及全展开RecyclerView的实现
456 0
RecyclerView定制:通用ItemDecoration及全展开RecyclerView的实现
利用RecyclerView实现无限轮播广告条2
利用RecyclerView实现无限轮播广告条
利用RecyclerView实现无限轮播广告条1
利用RecyclerView实现无限轮播广告条
|
Android开发
同一页面实现recycleView三种布局【recycleView + adapter】
同一页面实现recycleView三种布局【recycleView + adapter】
160 0
|
Android开发
关于安卓recyclerview的子布局中,scrollview滑动冲突问题
安卓recyclerview的子布局中,scrollview滑动冲突问题
233 0
SwipeRefreshLayout 嵌套 RecyclerView滑动冲突
SwipeRefreshLayout 嵌套 RecyclerView滑动冲突
333 0
|
前端开发 Android开发
【RecyclerView】 六、RecyclerView.ItemDecoration 条目装饰 ( 简介 | onDraw | onDrawOver | getItemOffsets )
【RecyclerView】 六、RecyclerView.ItemDecoration 条目装饰 ( 简介 | onDraw | onDrawOver | getItemOffsets )
191 0
还在为ScrollView嵌套RecyclerView而发愁吗?
还在为ScrollView嵌套RecyclerView而发愁吗?
198 0
|
Android开发 容器 数据格式
Android实践(一)| Fragment实现底部导航栏(解决重叠问题)
最初学习Android的时候,是边学习边做着一个小项目的,因为项目需求,需要实现一个底部导航栏的功能,由于基础知识受限,百度了很多博客,大致就找到两种实现方案:第一种就是直接用Fragment实现(点击切换),第二种是ViewPager+Fragment实现(除了点击切换,还支持左右滑动切换)。
2336 0