前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android完美解析setContentView 你真的理解setContentView吗?「建议收藏」

Android完美解析setContentView 你真的理解setContentView吗?「建议收藏」

作者头像
全栈程序员站长
发布于 2022-09-13 03:25:39
发布于 2022-09-13 03:25:39
1.6K00
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

导读:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
本篇文章的前半部分为源码分析,后半部分为一个例子,在例子中我们会遇到一些问题,从而回答前半部分留下的问题!

源码分析:

说到Activity的setContentView,咱们直接找到一个Activity中的setContentView点进去看看!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void setContentView(View view) {
        getWindow().setContentView(view);
        initActionBar();
    }

点进来之后我们发现它里边调用了getWindow.setContentView,我们点击getWindow看看里面是什么!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 public Window getWindow() {
        return mWindow;
    }

返回了一个Window对象,这个mWindow就是Window的子类PhoneWindow,每一个Activity都有一个PhoneWindow对象,至于他们是怎么联系起来的我们就不去研究了,好了现在我们来到了第一层!

我们在PhoneWindow中找到了setContentView的实现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class PhoneWindow extends Window implements MenuBuilder.Callback { 
   
    //...
    //...
    //...
    //老大
    @Override
    public void setContentView(int layoutResID) {
        if (mContentParent == null) {
            installDecor();
        } else {
            mContentParent.removeAllViews();
        }
        mLayoutInflater.inflate(layoutResID, mContentParent);
        final Callback cb = getCallback();
        if (cb != null && !isDestroyed()) {
            cb.onContentChanged();
        }
    }
    //老二
    @Override
    public void setContentView(View view) {
        setContentView(view, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
    }
    //和老三
    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        if (mContentParent == null) {
            installDecor();
        } else {
            mContentParent.removeAllViews();
        }
        mContentParent.addView(view, params);
        final Callback cb = getCallback();
        if (cb != null && !isDestroyed()) {
            cb.onContentChanged();
        }
    }

    //...
    //...
    //...
}

我们看到首先判断了mContentParent,那么这个mContentParent是个什么呢?当mContentParent为空的时候,会执行installDecor()方法,那么我们肯定是到installDecor中去找答案咯,点进去!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private void installDecor() {
            if (mDecor == null) {
                mDecor = generateDecor();
                //...
                }
            }
            if (mContentParent == null) {
                mContentParent = generateLayout(mDecor);

                        //...
                    }
                }
            }
    }

我把代码能删的都给删了,我们看见mContentParent为空的时候,会执行generateLayout()方法,同时需要传入一个mDecor,那么mDecor是什么东西呢,我们往上面看,mDecor是通过generateDecor()方法创建出来的,那我们自然得先到generateDecor()中一探究竟!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected DecorView generateDecor() {
        return new DecorView(getContext(), -1);
    }

new了一个DecorView对象,DecorView就是我们界面中最顶层的View了,这个View的结构是这样的!

DecorView继承于FrameLayout,然后它有一个子view即LinearLayout,方向为竖直方向,其内有两个FrameLayout,上面的FrameLayout即为TitleBar之类的,下面的FrameLayout即为我们的ContentView,所谓的setContentView就是往这个FrameLayout里面添加我们的布局View的!现在我们可以画出第二层了!

好了,现在mDecor有了,终于可以进入到generateLayout(mDecor);看看了!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
protected ViewGroup generateLayout(DecorView decor) {
//...

//省略一些设置Window样式的代码,直接来看我们最关心的代码!
 ViewGroup contentParent =(ViewGroup)findViewById(ID_ANDROID_CONTENT);
                    //... 
                    return contentParent;
                }
         }

ID_ANDROID_CONTENT就是R.id.content,就是这个FrameLayout

我们看到contentParent就是这个FrameLaout!所以这下我们清楚了,mContentParent就是这个FrameLayout,就是我们的ContentView,现在回到PhoneWindow中的setContentView方法中!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class PhoneWindow extends Window implements MenuBuilder.Callback { 
   
    //...
    //...
    //...
    //老大
    @Override
    public void setContentView(int layoutResID) {
        if (mContentParent == null) {
            installDecor();
        } else {
            mContentParent.removeAllViews();
        }
        mLayoutInflater.inflate(layoutResID, mContentParent);
        final Callback cb = getCallback();
        if (cb != null && !isDestroyed()) {
            cb.onContentChanged();
        }
    }
    //老二
    @Override
    public void setContentView(View view) {
        setContentView(view, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
    }
    //和老三
    @Override
    public void setContentView(View view, ViewGroup.LayoutParams params) {
        if (mContentParent == null) {
            installDecor();
        } else {
            mContentParent.removeAllViews();
        }
        mContentParent.addView(view, params);
        final Callback cb = getCallback();
        if (cb != null && !isDestroyed()) {
            cb.onContentChanged();
        }
    }

    //...
    //...
    //...
}

我们先来看老大,首先会先判断mContentParent是否为空,如果为空说明我们还没有DecorView,然后调用installDecor,之后我们的DecorView就准备好了,mContentParent也指向了我们的ContentView,由于是新建的,我们的mContentParent中肯定没有子View,如果不是新建的,我们要先把mContentParent中的子View全部清干净。接下来通过反射加载到我们传入的布局,接着下面会通过调用getCallBack得到一个CallBack对象cb,其实这个cb就是我们的Activity,接着会调用Activity的onContentChanged方法,这个方法是一个空实现,在后面的例子中我们会用到这个方法! 通过这一系列的过程,我们自己的View就被加载到那个FrameLayout中了,至此我们的布局就显示到屏幕上了!

老二和老三也非常的清晰,我们不是传入布局的id,而是传入一个View,mContentParent通过addView(view)来加载布局,那么这个和老大通过反射加载布局有什么区别吗? 答案肯定是有!我会通过一个例子来说明!

例子:

我们现在就来模拟一个需求,比如用户在MainActivity填写一个表单,这个表单有姓名和电话两个字段,当用户填完之后我们要进行提交,但是在提交之前我们希望有一个确认表单的页面来让用户确认一下信息是否填对,如果需要修改可以点击重填来修改,如果没问题就点击提交,然后跳到SecondActivity提示提交成功。

有问题版本

首先我们先来看一个有问题的版本,首先我们进入到填写表单的页面,填写完之后点击提交进入确认表单页面,然后点击重填,发现回来之后姓名栏和手机栏都是空的,然而我们确实在onContentChanged中为他们赋值了,不管了,再次填写,填完了点击提交,发现提交也点不了了,怎么点都没有反应!这是怎么回事呢!我们带着问题来看代码!

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends Activity implements OnClickListener{ 
   
    private static final int LAYOUT_FILL = 0;
    private static final int LAYOUT_CONFIRM = 1;
    private EditText et_name;
    private EditText et_phone;
    private Button bt_ok;
    private TextView tv_name;
    private TextView tv_phone;
    private Button bt_refilling;
    private Button bt_confirm;
    private String name;
    private String phone;
    private int currentLayout;
    private LayoutInflater mInflater;
    private View confirmView;
    private InputMethodManager imm;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //调用setContentView(int id) 加载填写表单布局
        setContentView(R.layout.activity_main);
        initViews();
        //注册监听器
        registerListeners();
        //初始化当前布局为填写表单布局
        currentLayout = LAYOUT_FILL;
    }
    /** * 初始化布局 */
    private void initViews() {
        imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

        //初始化布局加载器
        mInflater = LayoutInflater.from(this);
        //加载确认表单页面
        confirmView =mInflater.inflate(R.layout.activity_confirm, null);
        //拿到填写表单页面中的控件
        et_name = (EditText)findViewById(R.id.et_name);
        et_phone = (EditText)findViewById(R.id.et_phone);
        bt_ok = (Button)findViewById(R.id.bt_ok);
        //拿到确认表单页面中的控件
        tv_name = (TextView)confirmView.findViewById(R.id.tv_confirm_name);
        tv_phone = (TextView)confirmView.findViewById(R.id.tv_confirm_phone);
        bt_refilling = (Button)confirmView.findViewById(R.id.bt_refilling);
        bt_confirm = (Button)confirmView.findViewById(R.id.bt_comfirm);
    }
    /** * 注册监听器 */
    private void registerListeners() {
        bt_ok.setOnClickListener(this);
        bt_refilling.setOnClickListener(this);
        bt_confirm.setOnClickListener(this);
    }
    /** * 点击事件 */
    @Override
    public void onClick(View v) {
        if (currentLayout == LAYOUT_FILL) {
  
  //如果当前页面是填写表单页面
            switch (v.getId()) {
            case R.id.bt_ok://点击提交按钮
                if (TextUtils.isEmpty(et_name.getText().toString())) {
                    Toast.makeText(MainActivity.this, "姓名不能为空", Toast.LENGTH_SHORT).show();
                    return;
                }
                if (TextUtils.isEmpty(et_phone.getText().toString())) {
                    Toast.makeText(MainActivity.this, "手机号不能为空",Toast.LENGTH_SHORT).show();
                    return;
                }
                //隐藏软键盘
                imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
                //将EditText内容保存到变量中
                name = et_name.getText().toString();
                phone = et_phone.getText().toString();
                //将当前页面改为确认表单页面
                currentLayout = LAYOUT_CONFIRM;
                //调用setContentView(View view),显示确认表单页面
                setContentView(confirmView);
                break;
            }
        }else if (currentLayout == LAYOUT_CONFIRM) {
  
  //如果当前页面为确认表单页面
            switch (v.getId()) {
            case R.id.bt_refilling://重填按钮
                //调用setContentView(int id),显示填写表单页面
                setContentView(R.layout.activity_main);
                //将当前页面改为填写表单页面
                currentLayout = LAYOUT_FILL;
                break;
            case R.id.bt_comfirm://确认表单页面的最终提交按钮
                //跳到SecondActivity
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
                break;
            }
        }
    }
    /** * 调用了setContentView后会回调此方法 */
    @Override
    public void onContentChanged() {
        super.onContentChanged();
        if (currentLayout == LAYOUT_CONFIRM) {
  
  //如果当前页面是确认表单页面
            if (!TextUtils.isEmpty(name)) {
                //如果填写表单页面中的姓名不为空,我们将姓名一栏setText上
                tv_name.setText(name);
            }
            if (!TextUtils.isEmpty(phone)) {
                //如果填写表单页面中的电话不为空,我们将电话一栏setText上
                tv_phone.setText(phone);
            }
        }else if (currentLayout == LAYOUT_FILL) {
  
  //如果当前页面是填写表单页面
            //如果是第一次启动这个页面,我们判断name和phone是空,所以就不做任何的操作
            //如果是从确认表单页面点击重填按钮再次返回到填写表单页面时,我们就将刚刚填过
            //的信息再次填上,省的用户再重新填一遍
            if (!TextUtils.isEmpty(name)) {
                et_name.setText(name);
            }
            if (!TextUtils.isEmpty(phone)) {
                et_phone.setText(phone);
            }
        }
    }
}

那么问题就出现在了setContentView上面,我们在点击了重填按钮后,我们的setContentView使用的是老大,即setContentView(int id),回想刚才我们分析的源码,老大是通过反射拿到我们的view,而每次反射拿到的view都不是同一个view,也就是说我们在onCreate中setContentView(R.layout.activity_main)和在点击了重填后setContentView(R.layout.activity_main)实际上是两个View,那么通过findviewById拿到的控件也是两套不同的控件了,所以我们点击了重填后,我们确实是给tv_name和tv_phone赋值了,但是我们显示的View不是原来那个View了,是新的View,那么新的View里面的tv_name和tv_phone是空的!所以显示为空!点击提交按钮也是一个道理!我们给原来的bt_ok设置了监听器,而新的View的bt_ok是没有设置过监听器的,所以点击是没有效果的!说了这么多!有很多重复的话,就是为了给说明白这件事!这个就是老大与老二老三的不同之处!!

修改后:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends Activity implements OnClickListener{ 
   
    private static final int LAYOUT_FILL = 0;
    private static final int LAYOUT_CONFIRM = 1;
    private EditText et_name;
    private EditText et_phone;
    private Button bt_ok;
    private TextView tv_name;
    private TextView tv_phone;
    private Button bt_refilling;
    private Button bt_confirm;
    private String name;
    private String phone;
    private int currentLayout;
    private LayoutInflater mInflater;
    private View confirmView;
    private View fillView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //我们将setContentView放到initViews里面去调用
        initViews();
        //注册监听器
        registerListeners();
        //初始化当前布局为填写表单布局
        currentLayout = LAYOUT_FILL;
    }
    /** * 初始化布局 */
    private void initViews() {
        //初始化布局加载器
        mInflater = LayoutInflater.from(this);
        //加载填写表单页面
        fillView = mInflater.inflate(R.layout.activity_main, null);
        //加载确认表单页面
        confirmView =mInflater.inflate(R.layout.activity_confirm, null);
        //调用setContentView(View view)方法,传入一个View
        setContentView(fillView);
        //拿到填写表单页面中的控件
        et_name = (EditText)fillView.findViewById(R.id.et_name);
        et_phone = (EditText)fillView.findViewById(R.id.et_phone);
        bt_ok = (Button)fillView.findViewById(R.id.bt_ok);
        //拿到确认表单页面中的控件
        tv_name = (TextView)confirmView.findViewById(R.id.tv_confirm_name);
        tv_phone = (TextView)confirmView.findViewById(R.id.tv_confirm_phone);
        bt_refilling = (Button)confirmView.findViewById(R.id.bt_refilling);
        bt_confirm = (Button)confirmView.findViewById(R.id.bt_comfirm);
    }
    /** * 注册监听器 */
    private void registerListeners() {
        bt_ok.setOnClickListener(this);
        bt_refilling.setOnClickListener(this);
        bt_confirm.setOnClickListener(this);
    }
    /** * 点击事件 */
    @Override
    public void onClick(View v) {
        if (currentLayout == LAYOUT_FILL) {
  
  //如果当前页面是填写表单页面
            switch (v.getId()) {
            case R.id.bt_ok://点击提交按钮
                if (TextUtils.isEmpty(et_name.getText().toString())) {
                    Toast.makeText(MainActivity.this, "姓名不能为空", Toast.LENGTH_SHORT).show();
                    return;
                }
                if (TextUtils.isEmpty(et_phone.getText().toString())) {
                    Toast.makeText(MainActivity.this, "手机号不能为空",Toast.LENGTH_SHORT).show();
                    return;
                }
                //将EditText内容保存到变量中
                name = et_name.getText().toString();
                phone = et_phone.getText().toString();
                //将当前页面改为确认表单页面
                currentLayout = LAYOUT_CONFIRM;
                //调用setContentView(View view),显示确认表单页面
                setContentView(confirmView);
                break;
            }
        }else if (currentLayout == LAYOUT_CONFIRM) {
  
  //如果当前页面为确认表单页面
            switch (v.getId()) {
            case R.id.bt_refilling://重填按钮
                //调用setContentView(View view),显示填写表单页面
                setContentView(fillView);
                //将当前页面改为填写表单页面
                currentLayout = LAYOUT_FILL;
                break;
            case R.id.bt_comfirm://确认表单页面的最终提交按钮
                //跳到SecondActivity
                Intent intent = new Intent(MainActivity.this,SecondActivity.class);
                startActivity(intent);
                break;
            }
        }
    }
    /** * 调用了setContentView后会回调此方法 */
    @Override
    public void onContentChanged() {
        super.onContentChanged();
        if (currentLayout == LAYOUT_CONFIRM) {
  
  //如果当前页面是确认表单页面
            if (!TextUtils.isEmpty(name)) {
                //如果填写表单页面中的姓名不为空,我们将姓名一栏setText上
                tv_name.setText(name);
            }
            if (!TextUtils.isEmpty(phone)) {
                //如果填写表单页面中的电话不为空,我们将电话一栏setText上
                tv_phone.setText(phone);
            }
        }else if (currentLayout == LAYOUT_FILL) {
  
  //如果当前页面是填写表单页面
            //如果是第一次启动这个页面,我们判断name和phone是空,所以就不做任何的操作
            //如果是从确认表单页面点击重填按钮再次返回到填写表单页面时,我们就将刚刚填过
            //的信息再次填上,省的用户再重新填一遍
            if (!TextUtils.isEmpty(name)) {
                et_name.setText(name);
            }
            if (!TextUtils.isEmpty(phone)) {
                et_phone.setText(phone);
            }
        }
    }
}

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/153249.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
ChatGPT:“有多少人工,就有多少智能”
👆点击“博文视点Broadview”,获取更多书讯 作者:车万翔(哈工大) 整理:李rumor ---- 最近几天被OpenAI推出的ChatGPT[1]刷屏了,其影响已经不仅局限于自然语言处理(NLP)圈,就连投资圈也开始蠢蠢欲动了,短短几天ChatGPT的用户数就超过了一百万。 通过众多网友以及我个人对其测试的结果看,ChatGPT的效果可以用惊艳来形容,具体结果在此就不赘述了。 不同于GPT-3刚推出时人们的反应,对ChatGPT大家发出更多的是赞叹之词。 聊天、问答、写作、编程等等,样样精通。
博文视点Broadview
2023/04/04
6490
ChatGPT:“有多少人工,就有多少智能”
ChatGPT一小步,NLP范式转变一大步
来源:算法邦本文约7200字,建议阅读14分钟在本文中,我们将仔细研究这些能力是什么,大型语言模型可以提供什么,以及它们在更广泛的 NLP/ML 任务中的潜在优势是什么。 [ 导语 ]作者符尧,yao.fu@ed.ac.uk,爱丁堡大学 (University of Edinburgh) 博士生,本科毕业于北京大学;与Tushar Khot,彭昊在艾伦人工智能研究院 (Allen Institute for AI) 共同完成英文原稿;与李如寐(美团NLP中心)共同翻译为中文;感谢 Aristo teamm
数据派THU
2023/04/03
2810
ChatGPT一小步,NLP范式转变一大步
哈工大计算学部长聘教授车万翔:ChatGPT浅析
机器之心报道 机器之心编辑部 3 月 21 日,在机器之心举办的 ChatGPT 及大模型技术大会上,哈尔滨工业大学计算学部长聘教授、博士生导师车万翔发表主题演讲《ChatGPT 浅析》,在演讲中,他回答了 ChatGPT 究竟解决了什么科学问题,是如何解决该问题的,以及未来还有哪些亟待解决的问题。 另外我们也了解到,车万翔教授大模型相关的科研成果也正在进行产业转化,机器之心后续将为大家带来报道。 以下为车万翔在机器之心 AI 科技年会上的演讲内容,机器之心进行了不改变原意的编辑、整理: 大家好,我是
博文视点Broadview
2023/04/04
3680
哈工大计算学部长聘教授车万翔:ChatGPT浅析
哈工大车万翔教授带你学习NLP新范式:基于预训练的方法(赠书)
经过60余年的发展,人们已经研发了各种各样自然语言处理技术,这些纷繁复杂的技术本质上都是在试图回答一个问题:语义在计算机内部是如何表示的? 根据表示方法的不同,自然语言处理技术共经历了四次范式变迁,分别是小规模专家知识、大规模语料库统计模型、大规模语料库深度学习和大规模预训练语言模型。 特别是在2010 年之后,随着基于深度神经网络的表示学习方法的兴起,该方法直接端到端地学习各种自然语言处理任务,不再依赖人工设计的特征。深度学习可以有效地避免统计学习方法中的人工特征提取操作,自动地发现对于目标任务有效的表示
机器之心
2023/03/29
5500
哈工大车万翔教授带你学习NLP新范式:基于预训练的方法(赠书)
GPT大模型的涌现能力的概述
一个一直以来的共识是,模型的规模越大,模型在下游任务上的能力越多、越强。随着最近的新的模型的提出,大规模的语言模型出现了很多超乎研究者意料的能力。我们针对这些在小模型上没有出现,但是在大模型上出现的不可预测的能力——“涌现能力”做了一些归纳和总结,分别简要介绍了涌现能力的定义、常见的激发手段和具体的分类和任务。
算法进阶
2023/08/28
8150
GPT大模型的涌现能力的概述
揭秘自然语言处理中预训练语言模型的“魔力”之源
👆点击“博文视点Broadview”,获取更多书讯 自然语言处理被誉为“人工智能皇冠上的明珠”! 深度学习等技术的引入为自然语言处理技术带来了一场革命,近年来也出现了自然语言处理的新范式。 为什么自然语言是“人工智能皇冠上的明珠”呢? 自然语言处理,英文名称是Natural Language Processing,简称NLP,主要研究用计算机来理解和生成自然语言的各种理论和方法。 其中,自然语言指的是人类语言,特指文本符号,而非语音信号。对语音信号的识别与合成属于语音处理领域的研究范畴。 自然语言处理已
博文视点Broadview
2023/05/06
2030
揭秘自然语言处理中预训练语言模型的“魔力”之源
思维链(CoT)提出者 Jason Wei:关于大语言模型的六个直觉
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/
叶庭云
2023/12/09
8240
思维链(CoT)提出者 Jason Wei:关于大语言模型的六个直觉
中科院张家俊:ChatGPT中的提示与指令学习
中国科学院自动化研究所研究员张家俊以ChatGPT中的提示与指令学习为题,从ChatGPT简要技术回顾、迈向通用性的提示学习、从提示学习到指令学习、相关探索与学习等角度和在场听众展开技术分享。大模型主要有两个方向,一个是“预训练+参数微调”,就是大模型有了之后针对下游任务进行微调,然后得到一个面向下游任务的大的模型,二是“预训练+提示学习”,预训练之后不变,用提示学习激发大模型来完成特定的任务。相关实践证明,学习提示对于模型性能提升非常有效,怎样学到或者找到提示语非常关键。下面是分享的详细内容。
用户10103085
2023/04/11
7220
万字长文解读:从Transformer到ChatGPT,通用人工智能曙光初现
ChatGPT掀起的NLP大语言模型热浪,不仅将各家科技巨头和独角兽们推向风口浪尖,在它背后的神经网络也被纷纷热议。但实际上,除了神经网络之外,知识图谱在AI的发展历程中也被寄予厚望。自然语言处理是如何伴随人工智能各个流派不断发展、沉淀,直至爆发的?本文作者将带来他的思考。 作者 | 王文广 出品 | 新程序员 自ChatGPT推出以来,不仅业内津津乐道并纷纷赞叹自然语言处理(Natural Language Processing, NLP)大模型的魔力,更有探讨通用人工智能(Artificial gene
AI科技大本营
2023/04/14
6460
万字长文解读:从Transformer到ChatGPT,通用人工智能曙光初现
复旦大学教授详解大规模语言模型
自2020年 OpenAI 发布了包含1750亿个参数的生成式大规模预训练语言模型 GPT-3(Gen- erative Pre-trained Transformer 3)[1]以来,包括Google、Meta、百度、智源研究院等在内的公司和研究机构纷纷发布以 PaLM[2]、LaMDA[4]、T0[5]等为代表的不同的大规模语言模型(Large Language Model ,LLM ),也称大模型。
博文视点Broadview
2023/09/07
4780
复旦大学教授详解大规模语言模型
热点解读:大模型的突现能力和ChatGPT引爆的范式转变
机器之心转载 作者:符尧、Tushar Khot、彭昊、李如寐等 符尧(yao.fu@ed.ac.uk),爱丁堡大学 (University of Edinburgh) 博士生,本科毕业于北京大学。他与 Tushar Khot、彭昊在艾伦人工智能研究院 (Allen Institute for AI) 共同完成英文原稿,与李如寐(美团 NLP 中心) 共同翻译为中文。感谢 Aristo teammates, Jingfeng Yang, and Yi Tay 的讨论与建议。请同时参考 CoT 团队的博客[1
机器之心
2023/03/29
3490
热点解读:大模型的突现能力和ChatGPT引爆的范式转变
FinGPT——为金融领域的大模型应用提供了更多的可能
在ChatGPT引领的AI浪潮下,涌现了一大批优秀的AI应用,AI正在不断地重塑一个又一个行业,今天介绍的这个AI项目是跑进github前三甲的金融领域的代表:FinGPT。
山行AI
2023/06/26
3.5K0
FinGPT——为金融领域的大模型应用提供了更多的可能
系统学习大模型的20篇论文
【引子】“脚踏实地,仰望星空”, 知其然还要知其所以然。读论文是一条重要的途径,这一篇文章https://magazine.sebastianraschka.com/p/understanding-large-language-models非常值得借鉴,不敢私藏,编译成文。
半吊子全栈工匠
2023/09/02
4.3K0
系统学习大模型的20篇论文
ChatGPT的各项超能力从哪儿来?万字拆解追溯技术路线图来了!
机器之心发布 作者:符尧、彭昊、Tushar Khot、郭志江等 符尧(yao.fu@ed.ac.uk),爱丁堡大学 (University of Edinburgh) 博士生,本科毕业于北京大学。他与彭昊、Tushar Khot在艾伦人工智能研究院 (Allen Institute for AI) 共同完成英文原稿,与剑桥大学郭志江共同翻译为中文。 感谢上海交通大学何俊贤,加州大学洛杉矶分校鲁盼,达特茅斯学院刘睿博对初稿的讨论与建议。感谢 Raj Ammanabrolu (Allen Institute
机器之心
2023/03/29
7270
ChatGPT的各项超能力从哪儿来?万字拆解追溯技术路线图来了!
GPT 模型成功的背后用到了哪些以数据为中心的人工智能(Data-centric AI)技术?
作者丨查道琛 人工智能(Artificial Intelligence, AI)最近取得了巨大的进展,特别是大语言模型(Large Language Models, LLMs),比如最近火爆全网的ChatGPT和GPT-4。GPT模型在各项自然语言处理任务上有着惊人的效果。至于具体有多强,这里就不再赘述了。做了这么多年AI研究好久没这么激动过了。没试过的朋友赶紧试一下! 正所谓「大力出奇迹」,把参数量调「大」能提高模型性能已经成为了大家的普遍共识。但是仅仅增加模型参数就够了吗?仔细阅读GPT的一系列论文后就
AI科技评论
2023/04/04
9050
GPT 模型成功的背后用到了哪些以数据为中心的人工智能(Data-centric AI)技术?
清华教授欧智坚专访,深度剖析ChatGPT的光环背后及未来挑战!
---- 新智元报道   作者:欧智坚 编辑:好困 【新智元导读】严谨谈谈ChatGPT取得的进步、不足及迈向通用人工智能(AGI)的挑战。 2022年11月底,ChatGPT一经推出,全球关注,风头依旧强劲!取代搜索引擎,奇点说,拐点说,若干职业面临失业危机,人类面临终极挑战…,面对如此热点,本文分享我们的认识,欢迎讨论和指正。 总的来说,ChatGPT取得了显著科技进步,尽管有不足,但迈向AGI(artificial general intelligence,通用人工智能)仍充满诸多挑战! 图1
新智元
2023/03/29
4100
清华教授欧智坚专访,深度剖析ChatGPT的光环背后及未来挑战!
AI_Papers周刊:第五期
1.Larger language models do in-context learning differently
AiCharm
2023/05/15
3140
AI_Papers周刊:第五期
复旦清华联合顶刊发文|ChatGPT:潜力、前景和局限
---- 新智元报道   来源:信息与电子工程前沿FITEE 作者:周杰 柯沛 邱锡鹏 黄民烈 张军平 编辑:好困 【新智元导读】为更好地理解ChatGPT,这里我们简要介绍其历史,讨论其优点和不足,指出几个潜在应用,最后分析它对可信赖人工智能、会话搜索引擎和通用人工智能(artificial general intelligence, AGI)发展的影响。 最近,OpenAI发布了对话生成预训练模型Transformer(Chat Generative Pre-trained Transformer
新智元
2023/03/29
4500
复旦清华联合顶刊发文|ChatGPT:潜力、前景和局限
自然语言处理学术速递[6.18]
访问www.arxivdaily.com获取含摘要速递,涵盖CS|物理|数学|经济|统计|金融|生物|电气领域,更有搜索、收藏、发帖等功能!点击阅读原文即可访问 cs.CL 方向,今日共计32篇 Tr
公众号-arXiv每日学术速递
2021/07/02
7300
自然语言处理学术速递[12.17]
【1】 Pushing the Limits of Rule Reasoning in Transformers through Natural Language Satisfiability 标题:通过自然语言可满足性突破Transformer规则推理的极限 链接:https://arxiv.org/abs/2112.09054
公众号-arXiv每日学术速递
2021/12/17
1.2K0
推荐阅读
相关推荐
ChatGPT:“有多少人工,就有多少智能”
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档