Android简单通用数据传输工具

本篇文章是墨香投稿,是一位半路入行的Android开发者,29岁的他辞去几年工作,对软件开发一窍不通的他,为了梦想2014年初进入培训,后来还好了一份不错的工作,现在是我们群的管理员兼老大哥了,他对技术热情和专注是值得我们很多人学习的,他的经历也很值得很多初学者去参考。

最近刚换了一家公司,终于摆脱了孤军奋战的工作方式,而是进入了真正的团队作战,也让我感觉到了自己技能的不足,之前由于孤军奋战,对自己这样一个新手来说是寸步难行,公司项目紧张,而自己能力有限,又没有人可以商量和学习,所以吃了很多苦,每晚都是很晚才回来,但也学到了很多东西,可以说是被逼无奈,但对自己来说也是好事,在最短的时间学到了很多使用性东西,但对于这个快速发展的软件行业还是相差甚远,现在也终于有机会跟新公司的高手学习一下了。好了,感慨一下,下面进入正轨。

最近在新公司做封装广告SDK的工作,要求比较高,要求一键调用,对于代码的要求比较高,格式、命名、规范都有严格要求,因此虽然时间较短但也提升不少。前天在做一个数据同步的工作,要求在一个view跳转到一个activity,要求在activity操作的时候要同步view视图,因此也遇到了数据传输的问题,之前也曾考虑过,但是没有想出更好的方法,最近用接口设置监听用的比较多,突发想法,自己设计了一个方法比较实用,在此作为记录,如果谁有更好方法希望不吝赐教,先行谢过。 下面我以一个实例来介绍一下: 我有两个activity,一个MyActivity用来接收数据,另一个SecondActivity用来发送数据,这种可能我们会想到startActivityForResult,但是如果是其他的呢,不是两个activity,又会怎么处理呢,我突然想到一个通用的方法,不管是从哪里传到哪里,都可以通用,设计思路如下:

中间是一个工具类:TransferDataTool,里面是一个接口OnDataHandlerListener,在MyActivity跳转到SecondActivity之前要将接口实例化,然后通过SetOnDataHandlerListener传递到工具类中,跳转到SecondActivity后再需要传递出数据时调用handlerData方法会调用接口中的方法,进行传值,而在M有Activity中有监听就会接收到相应数据。 注意:如果想多个类通用可以将接口中的方法中的参数改成Object类型。 总共三个类,两个activity,一个工具类TransferDataTool,用来传输数据。 MyActivity类,用来接收数据,在跳转之前要设置监听对象到工具类,代码:

public class MyActivity extends Activity {

    private TextView mTv;
    private Button mBtn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        mBtn = (Button) findViewById(R.id.btn);
        mTv = (TextView) findViewById(R.id.tv);
        mBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) { //设置监听接受数据
                //将mOnDataHandlerListener传递到工具类
                TransferDataTool.getInstance().setOnDataHandlerListener(mOnDataHandlerListener);
                startActivity(new Intent().setClass(MyActivity.this, SecondActivity.class));
            }
        });

    }

    //用来监听数据
    private TransferDataTool.OnDataHandlerListener mOnDataHandlerListener
            = new TransferDataTool.OnDataHandlerListener() {

        @Override
        public void onDataHandler(String s) {
            mTv.setText(s);
        }
    };
}

xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="跳转到SecondActivity" />

    <TextView
        android:id="@+id/tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:layout_gravity="center_horizontal"
        android:textSize="20sp"
        android:text="Hello World, MyActivity" />
</LinearLayout>

SecondActivity数据传输类,代码:

public class SecondActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.second_activity);
        Button btn = (Button) findViewById(R.id.btn);
        btn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String s = "SecondActivity";
                //将数据传出
                TransferDataTool.getInstance().handlerData(s);
                finish();
            }
        });
    }

    @Override
    protected void onDestroy() {
        //释放
        TransferDataTool.getInstance().finishDataHandlerListener();
        super.onDestroy();
    }
}

xml代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="SecondActivity,点击返回名字" />

</LinearLayout>

TransferDataTool类,要用单例模式,防止监听对象被重新初始化,代码:

public class TransferDataTool {

    private static TransferDataTool sTransferDataTool;

    //单例模式
    public static TransferDataTool getInstance() {
        if (sTransferDataTool == null) {
            synchronized (TransferDataTool.class) {
                if (sTransferDataTool == null) {
                    sTransferDataTool = new TransferDataTool();
                }
            }
        }
        return sTransferDataTool;
    }

    private OnDataHandlerListener mOnDataHandlerListener;

    /**
     * /初始化监听--数据接收方调用
     * 接收监听:onDataHandlerListener
     *
     * @param onDataHandlerListener 监听
     */
    public void setOnDataHandlerListener(final OnDataHandlerListener onDataHandlerListener) {
        this.mOnDataHandlerListener = onDataHandlerListener;
    }

    //释放监听
    public void finishDataHandlerListener() {
        mOnDataHandlerListener = null;
    }

    //调用监听--数据传出方调用
    public void handlerData(final String s) {
        if (mOnDataHandlerListener != null) {
            //调用监听接口中的方法传输数据
            mOnDataHandlerListener.onDataHandler(s);
        }
    }

    //接口,数据传输工具,如果通用可以将String改为Object
    public interface OnDataHandlerListener {
        void onDataHandler(String s);
    }
}

优点:灵活实用接口和单例模式进行数据传递,简单方便没有任何限制,可以传递任何类型, 缺点:如果较多需要些很多接口,不适合长时间的接口监听,有可能被系统回收。

原文发布于微信公众号 - 小巫技术博客(wwjblog)

原文发表时间:2016-04-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android先生

RxJava2 实战知识梳理(2) - 计算一段时间内数据的平均值

今天,我们继续跟着 RxJava-Android-Samples 的脚步,一起看一下RxJava2在实战当中的应用,在这个项目中,第二个的例子的描述如下...

934
来自专栏非著名程序员

CoordinatorLayout的使用如此简单

曾在网上找了一些关于CoordinatorLayout的教程,大部分文章都是把CoordinatorLayout、AppbarLayout、Collapsing...

21810
来自专栏QQ音乐技术团队的专栏

Android系统线控和歌曲信息屏显的那点事

目前Android系统中主流的音乐播放器都支持线控的功能,线控设备包括有线耳机和蓝牙耳机或蓝牙车机,当不方便操作手机的时候可以通过线控来控制音乐的播...

4668
来自专栏携程技术中心

干货 | MVP模式在携程酒店的应用和扩展

作者简介 赵伟麟,2011年就职于创新工场旗下点心OS,2014年加入携程酒店事业部,从事Android研发工作。擅长基于组件的业务架构,系统架构,建模,性能优...

38411
来自专栏葬爱家族

Android高德之旅(1)基础地图

这个系列之前在CSDN上就发了,不过刚开始就因为公司项目忙搁置了,现在转移阵地到简书,希望这次能坚持把这个系列做完。

1022
来自专栏项勇

笔记58 | Android闹钟

2633
来自专栏Android小菜鸡

Android Touch事件传递机制

  Touch事件的传递机制与生活贴近,从父布局开始一步一步的向下分发事件。分发事件时调用boolean dispatchTouchEvent(MotionEv...

1953
来自专栏LinXunFeng的专栏

iOS - SceneKit显示与交互3D建模(一)

1984
来自专栏项勇

[Android笔记8]使用Zxing实现二维码扫描

2466
来自专栏图像识别与深度学习

《Android》Lesson20-广播2

1244

扫码关注云+社区

领取腾讯云代金券