//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 !!!
。
答案 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>();
。