有時時候我們會看到諸如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類中定義了內部類,又沒有使用的話,它的信息是不會出現在堆中的。
希望對大家有所幫助。