Android(Java)内部类的表示
程序员文章站
2022-03-29 20:16:33
有时时候我们会看到诸如MainActivity$MyHandler或MainActivity$1、MainActivity$2这些带美元符号的名称,它们是什么意思。今天我来和大家说一下。在Java中,如果内部类是有名称的,则在$后加名称,否则按出现的顺序依次编号,如$1、$2、$3…我们以下面这个例子来说明一下:package com.wong.ex;public class MainActivity extends AppCompatActivity{ private TextView...
有时时候我们会看到诸如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类中定义了内部类,又没有使用的话,它的信息是不会出现在堆中的。
希望对大家有所帮助。
本文地址:https://blog.csdn.net/weixin_40763897/article/details/107177565
上一篇: css-css和html的结合方式(四种结合方式)
下一篇: avs3工程编译
推荐阅读
-
android中写一个内部类来选择文件夹中指定的图片类型实例说明
-
Java编程实现生成给定范围内不重复随机数的方法小结
-
Android studio怎么创建文件? Android studio新建Java类文件的方法
-
详解Java编程中的反射在Android开发中的应用
-
Android通过Java sdk的方式接入OpenCv的方法
-
Android通过Java sdk的方式接入OpenCv的方法
-
Delphi在Android下使用Java库的方法
-
android用java和c实现查找sd卡挂载路径(sd卡路径)的方法
-
java8获取一个时间段内的所有年月日期
-
Java开发笔记(六十)匿名内部类的优势