Android(Java)内部类的表示

举报
yd_221104950 发表于 2020/12/02 23:38:16 2020/12/02
2.5k+ 0 0
【摘要】 有时时候我们会看到诸如MainActivity$MyHandler或MainActivity$1、MainActivity$2这些带美元符号的名称,它们是什么意思。今天我来和大家说一下。在Java中,如果内部类是有名称的,则在$后加名称,否则按出现的顺序依次编号,如$1、$2、$3… 我们以下面这个例子来说明一下: package com.wong.ex; publ...

有时时候我们会看到诸如MainActivity$MyHandler或MainActivity$1、MainActivity$2这些带美元符号的名称,它们是什么意思。今天我来和大家说一下。在Java中,如果内部类是有名称的,则在$后加名称,否则按出现的顺序依次编号,如$1、$2、$3…
我们以下面这个例子来说明一下:

package com.wong.ex;

public class MainActivity extends AppCompatActivity{ private TextView mTV; private MainModel model; private MyHandler myHandler = new MyHandler(this); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mTV = findViewById(R.id.tv); model = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(MainModel.class); model.getDataBean().observe(this, new Observer<DataBean>() { @Override public void onChanged(DataBean dataBean) { if(TextUtils.isEmpty(dataBean.getData())) return; mTV.setText(Html.fromHtml(dataBean.getData())); } }); run("https://www.baidu.com"); } private static class MyHandler extends  Handler{ private MainActivity activity; public MyHandler(MainActivity activity){ this.activity = activity; } @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case 1: activity.handleResponse((String)msg.obj ); break; } } } private void handleResponse(String str){ if(model != null){ model.doAction(str); } } private void run(final String url) { OkHttpClient client = new OkHttpClient(); Request request = new Request.Builder() .url(url) .build(); client.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { } @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { String str = response.body().string(); Message message = myHandler.obtainMessage(); message.what = 1; message.obj = str; myHandler.sendMessage(message); } }); }
}

  
 

上面有一个命名的内部类MyHandler,所以有会标记为MainActivity$MyHandler
还有两个匿名内部类:
匿名内部类1:

 model.getDataBean().observe(this, new Observer<DataBean>() { @Override public void onChanged(DataBean dataBean) { if(TextUtils.isEmpty(dataBean.getData())) return; mTV.setText(Html.fromHtml(dataBean.getData())); } });

  
 

匿名内部类就是new Observer(){},因为按顺序它最先出现,所以它会标记为MainActivity$1

匿名内部类2:

  client.newCall(request).enqueue(new Callback() { @Override public void onFailure(@NotNull Call call, @NotNull IOException e) { } @Override public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException { String str = response.body().string(); Message message = myHandler.obtainMessage(); message.what = 1; message.obj = str; myHandler.sendMessage(message); } });

  
 

匿名内部类是new Callback() {},因为按顺序,它是第二个出现的,所以它会被标记为MainActivity$2

这些标记会出现在堆信息中,但是如果在Java类中定义了内部类,又没有使用的话,它的信息是不会出现在堆中的。

希望对大家有所帮助。

文章来源: blog.csdn.net,作者:WongKyunban,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/weixin_40763897/article/details/107177565

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。