2014-10-25 5 views
-1
//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

변수를 증가시킵니다. – Boann

+0

내부 클래스에 변수를 추가하면 어떻게 내부 클래스 외부에서 읽을 수 있습니까? – cow12331

+0

다른 곳에 넣으십시오. – Boann

답변

0

컴파일러가 말한 것처럼 문제는 내부 클래스 내부의 final 변수가 아닌 것입니다. 이것을 final ArrayList<StreamStatus> list = new ArrayList<StreamStatus>();으로 변경하십시오.

1

이는 : 당신이 그것을 사용할 수 있도록

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

최종 선언해야합니다.

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은 multipel 메시지가 100을 초과 할 경우 위험 할 수 있으므로 내 제안이 완전히 잘못되었다고해도> 100 이상이면 좋습니다.