前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android简单通用数据传输工具

Android简单通用数据传输工具

作者头像
巫山老妖
发布2018-07-20 11:34:59
2670
发布2018-07-20 11:34:59
举报
文章被收录于专栏:小巫技术博客

本篇文章是墨香投稿,是一位半路入行的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类,用来接收数据,在跳转之前要设置监听对象到工具类,代码:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
<?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数据传输类,代码:

代码语言:javascript
复制
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代码:

代码语言:javascript
复制
<?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类,要用单例模式,防止监听对象被重新初始化,代码:

代码语言:javascript
复制
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);
    }
}

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-04-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小巫技术博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档