Android(Java)內部類的表示

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

希望對大家有所幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章