如何调试此代码以了解其作用?

时间:2019-12-03 05:04:04

标签: android android-studio

首先,我很抱歉这个问题不合适。

我正在我的Android应用程序中实现一个国家/地区选择器功能,我找到了一个github项目,这对我来说是一个好的开始。该代码可以正常运行,并且符合预期。

我首先将其分解以了解其工作原理。

这是代码的模糊部分

@Override
    protected ArrayList<Country> doInBackground(Void... params) {
        ArrayList<Country> data = new ArrayList<Country>(233);
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new InputStreamReader(mContext.getApplicationContext().getAssets().open("countries.dat"), "UTF-8"));

            // do reading, usually loop until end of file reading
            String line;
            int i = 0;
            while ((line = reader.readLine()) != null) {
                //process line
                Country c = new Country(mContext, line, i);
                data.add(c);
                ArrayList<Country> list = mCountriesMap.get(c.getCountryCode());
                if (list == null) {
                    list = new ArrayList<Country>();
                    mCountriesMap.put(c.getCountryCode(), list);
                }
                list.add(c);
                i++;
            }
        } catch (IOException e) {
            //log the exception
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    //log the exception
                }
            }
        }
        //this code enables app to pick the right default country from the spinner
        String countryRegion = PhoneUtils.getCountryRegionFromPhone(mContext);
        int code = mPhoneNumberUtil.getCountryCodeForRegion(countryRegion);

        final ArrayList<Country> list = mCountriesMap.get(code);

        /*getActivity().runOnUiThread(new Runnable() {
            @Override
            public void run() {
                for(int i = 0; i < list.size(); i++)
                    Toast.makeText(mContext, "ds: " + list.get(i).getName(), Toast.LENGTH_SHORT).show();
            }
        });*/
        if (list != null) {
            for (Country c : list) {
                if (c.getPriority() == 0 || c.getPriority() == 1) {
                    mSpinnerPosition = c.getNum();
                    break;
                }
            }
        }
        return data;
    }

此代码读取asset文件夹中的文件并将对象添加到列表中。 之后,它会选择设备的国家/地区,然后从所有国家/地区的微调器中选择它

while循环中,我认为list.add(c);这行是没有意义的,因为while循环将再次循环并创建新的列表对象。如果我对此行发表评论,即使mCountriesMap.get(code)不为空,mCountriesMap也会返回空列表。

所以我的问题是为什么会发生这种现象? list.add(c);在这里做什么?

2 个答案:

答案 0 :(得分:1)

要考虑的重要部分是

mCountriesMap.put(c.getCountryCode(), list);

这会将新创建的列表添加到mCountriesMap,因此,即使它在循环中每次迭代都创建了一个新列表,仍可以通过地图访问以前创建的列表。

答案 1 :(得分:1)

想象有3个国家/地区代码{US,US,AU}. 因此,运行此命令会导致

mCountriesMap{
              US: List{US,US}
              AU: List{AU} 
             }

我认为您的疑问是list.add(c);之后的mCountriesMap.put(c.getCountryCode(), list);

我将尝试逐步解释

第一种情况

ArrayList<Country> list = mCountriesMap.get(US); //No value in mCountriesMap
if (list == null) { //list is null so true
    list = new ArrayList<Country>();
    mCountriesMap.put(US, list); //mCountriesMap{US: List{} }          
}
list.add(US); //mCountriesMap{US: List{US} }  here hashmap will get updated

第二种情况

ArrayList<Country> list = mCountriesMap.get(US); //get the prevous list
if (list == null) { //list have value so false
    list = new ArrayList<Country>();
    mCountriesMap.put(US, list); //mCountriesMap{US: List{US} }          
}
list.add(US); //mCountriesMap{US: List{US,US} }  here hashmap will get updated

第3个只是第一种情况的重复。