欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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