如何计算在内部类中调用方法的次数?

时间:2014-10-25 16:39:36

标签: java twitter4j inner-classes

    //get the number of tweets with keyword
public ArrayList<StreamStatus> getStream(String keyWord, int number) {
    TwitterStream twitterStream = new TwitterStreamFactory().getInstance();
    ArrayList<StreamStatus> list = new ArrayList<StreamStatus>();
    StatusListener listener = new StatusListener() {
        @Override
        public void onStatus(Status status) {
            if(status.getGeoLocation() != null) {
                StreamStatus stramStatus = new StreamStatus();
                list.add(stramStatus);      //don't allow do that !!!
//cannot refer to a-non-final variable inside a inner class defined in a different method 
            }
        }
    };
    twitterStream.addListener(listener);
    String[] keyword = {"ebola"};
    FilterQuery filtro = new FilterQuery().track(keyword);    
    twitterStream.filter(filtro);
    if(list.size() == 100) {
        twitterStream.cleanUp();
        twitterStream.shutdown();
    }
    return list;
}

我使用其他API来实现我的编程,其中有一个内部类。似乎twitterStream会多次使用该类。我想记录public void onStatus(Status status)被调用的次数?

谈到反击,我认为这更容易理解我的问题。实际上,我只是想知道如上所述如何实施list.add(stramStatus); //don't allow do that !!!

2 个答案:

答案 0 :(得分:1)

这:

ArrayList<StreamStatus> list = new ArrayList<StreamStatus>();

应该声明为final,以便您可以使用它。 像:

final List<StreamStatus> list = new ArrayList<StreamStatus>();

你得到的错误应该给你一个提示,你不能访问非最终的堆栈变量。

或者,您可以将其连接到实例变量。 (将列表推送到类而不是方法内部。)

我怀疑你的方法是否会达到这个目的:

twitterStream.filter(filtro);
if(list.size() == 100) {
    twitterStream.cleanUp();
    twitterStream.shutdown();
}

我认为列表不会一直是100,而且我没有循环直到它到达那里。你冒着它超过100的风险,你最终错过了你的清理/关机。可能你需要这样做:

while (list.size() < 100) {
    Thread.yield();
    twitterStream.filter(filtro);
}

twitterStream.cleanUp();
twitterStream.shutdown();

但这只是一个猜测,因为我以前没有使用twitterstream,我只是假设这些方法可以正常工作。但请注意它。 == 100是危险的,以防万一消息超过100,所以无论你做什么&gt; = 100都更好,即使我的建议是完全错误的。

答案 1 :(得分:0)

问题是,正如编译器所说的那样,你指的是内部类中的非final变量。将其更改为final ArrayList<StreamStatus> list = new ArrayList<StreamStatus>();