0

这是我的课:

public class JsoupParser 
{
    ArrayList<CompanyInfo> arr = new ArrayList<CompanyInfo>();

    public static final String SITE = "http://www.example.com/";

    public JsoupParser() {}

    public ArrayList<CompanyInfo> parse(final String link) 
                           throws InterruptedException, ExecutionException
    {

        new RealParser().execute(link).get();

        return arr;
    }

    class RealParser extends AsyncTask<String, Void, Void>
    {
        @Override
        protected Void doInBackground(String... params) 
        {

            Document doc = null;
            String link = params[0];
            try 
            {
                doc = Jsoup.connect(link).get();
            } 
            catch (IOException e) 
            {
                e.printStackTrace();
            }

            Elements a = doc.select("a.company_logo");
            Elements img = a.select("img");
            Iterator aIter = a.iterator();
            int i = 0;
            CompanyInfo info = new CompanyInfo();
            while(aIter.hasNext())
            {
                aIter.next();
                info.setCompanyName(a.get(i).attr("title"));
                info.setCompanyListingLink(SITE+ a.get(i).attr("href"));
                info.setCompanyLogoLink(SITE+ img.get(i).attr("src"));
                arr.add(info);
                ++i;
            }
            return null;
        }           
    }
}

我敢肯定,解析代码工作正常(在 Java 项目中测试)。

问题是,arr最后的所有元素都变得相同(突然变得等于插入到的第一个元素arr)。我调试并看到,每个元素都不同。

每次info对象不同时,这意味着我添加了不同的元素来arr执行此操作arr.add(info);。在循环中调试while一切正常,但一旦退出AsyncTaskarr就会变成具有多个相同对象的 ArrayList 。

我该如何解决这个问题?我究竟做错了什么?

4

3 回答 3

2

是的,因为您不断重复使用同一个CompanyInfo对象。
您需要CompanyInfo info = new CompanyInfo();while循环内移动。

于 2012-11-28T12:54:48.383 回答
2

把这个放在循环里面

CompanyInfo info = new CompanyInfo();

喜欢

信息 = 新公司信息();

于 2012-11-28T12:57:01.763 回答
0

首先,您arr一遍又一遍地将相同的对象添加到您的对象中。如果这会产生您观察到的结果,请不要感到惊讶。

其次,您正在以aIter一种非常不寻常的方式使用迭代器;看起来您混淆了迭代器的使用和对索引的循环。

于 2012-11-28T12:58:01.030 回答