2016-08-08 6 views
1

여기 좀 밀어 주시겠습니까? onPerformSyn 내부에서 옐프 API를 실행하려고 시도했습니다. 어떻게하면 가능합니까? 아래 오류가 나타납니다. "빈 생성자가 없습니다" 생성자를 만들려고이 post을 사용하고 있지만 작동하지 않습니다.
도움주세요.

참고 : Yelp 응답 후에 나는 데이터가 SQLite (Scheme Library)에 저장되어 코드의 끝이 아닐 것입니다. 대신 나는 Gradle을이 라인을 사용, 내가 그것을 가져올 수 onPerformSync 내부에서 Yelp API를 구현하는 방법

public class SyncAdapter extends AbstractThreadedSyncAdapter{ 
    public final String LOG_TAG = SyncAdapter.class.getSimpleName(); 
    public static final int SYNC_INTERVAL = 4;//60 * 180; 
    public static final int SYNC_FLEXTIME = SYNC_INTERVAL/3; 
    private static final long DAY_IN_MILLIS = 1000;//1000 * 60 * 60 * 24; 
    private static final int WEATHER_NOTIFICATION_ID = 3004; 

    private GoogleApiClient mGoogleApiClient; 
    private YelpAPI yelpAPI; 
    private Location mLastLocation; 

    public SyncAdapter(Context context, boolean autoInitialize) { 
     super(context, autoInitialize); 

//  YelpAPIFactory apiFactory = new YelpAPIFactory(BuildConfig.YELP_CONSUMER_KEY, BuildConfig.YELP_CONSUMER_SECRET, BuildConfig.YELP_TOKEN, BuildConfig.YELP_TOKEN_SECRET); 
//  yelpAPI = apiFactory.createAPI(); 
    } 


    @Override 
    public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) { 


     class YelpApi2 extends DefaultApi10a { 

      @Override 
      public String getAccessTokenEndpoint() { 
       return null; 
      } 

      @Override 
      public String getAuthorizationUrl(Token arg0) { 
       return null; 
      } 

      @Override 
      public String getRequestTokenEndpoint() { 
       return null; 
      } 

     } 

     class Yelp { 
      OAuthService service; 
      Token accessToken; 
      public Yelp(String consumerKey, String consumerSecret,  String token, String tokenSecret) { 
       this.service = new ServiceBuilder().provider(YelpApi2.class).apiKey(consumerKey).apiSecret(consumerSecret).build(); 
       this.accessToken = new Token(token, tokenSecret); 
      } 

      public String search(String term, double latitude, double longitude) { 
       OAuthRequest request = new OAuthRequest(Verb.GET, "http://api.yelp.com/v2/search"); 
       request.addQuerystringParameter("term", term); 
       request.addQuerystringParameter("ll", latitude + "," + longitude); 
       this.service.signRequest(this.accessToken, request); 
       Response response = request.send(); 
       return response.getBody(); 
      } 

     } 



      Yelp yelp = new Yelp(BuildConfig.YELP_CONSUMER_KEY, BuildConfig.YELP_CONSUMER_SECRET, BuildConfig.YELP_TOKEN, BuildConfig.YELP_TOKEN_SECRET); 
      String response = yelp.search("church", 30.361471, -87.164326); 

      System.out.println(response); 
      } 

나는이 tut, 을 따라하지만 난 .JAR 부분을하지 않았다.

 compile 'com.yelp.clientlib:yelp-android:2.0.0' 

Error I'm getting 
========================================= 

    FATAL EXCEPTION: SyncAdapterThread-1 
    Process: mem.edu.joshua, PID: 14149 
    org.scribe.exceptions.OAuthException: Error while creating the Api object 
    at org.scribe.builder.ServiceBuilder.createApi(ServiceBuilder.java:59) 
    at org.scribe.builder.ServiceBuilder.provider(ServiceBuilder.java:45) 
    at mem.edu.joshua.sync.SyncAdapter$1Yelp.<init>(SyncAdapter.java:99) 
    at mem.edu.joshua.sync.SyncAdapter.onPerformSync(SyncAdapter.java:116) 
    at android.content.AbstractThreadedSyncAdapter$SyncThread.run(AbstractThreadedSyncAdapter.java:259) 

    Caused by: java.lang.InstantiationException: can't instantiate class mem.edu.joshua.sync.SyncAdapter$1YelpApi2; no empty constructor 
    at java.lang.Class.newInstanceImpl(Native Method) 
    at java.lang.Class.newInstance(Class.java:1208) 


    [1]: http://stackoverflow.com/questions/11859403/no-empty-constructor-when-create-a-service 
    [2]: https://thysmichels.com/2011/12/30/yelp-api-example/#comment-18031 
+0

빈 생성자를 SyncAdapter에 추가하려고 했습니까? 마찬가지로 : public SyncAdapter() {} –

+0

팀, 방금 시도했습니다. 잘 모르겠 SyncAdapter 생성자가 이미 있다면,하지만 만약 당신이 '공백'이라고 말하면 나는 super()를 요구하는 에러를 낸다. 만약 super()를한다면 괄호 안에 들어가야 할 것이있다. 'super() 메소드를 해결할 수 없습니다.'오류가 발생했습니다. 그래서 지금 바로 Context와 Boolean을 추가해야합니다. – Erik

+0

그래서 다시 살펴보면서 실제로 SyncAdapter가 아니라는 사실을 깨달았습니다. 그러나 YelpApi2 클래스의 구현. 클래스 (또는 수퍼 클래스)가 기본 'no args'생성자를 필요로하는 경우에는 예외가 발생합니다. 빈 생성자를 YelpApi2 클래스에 추가해보십시오. public (또는 private) YelpApi2() {}; –

답변

0

문제는 ServiceBuilder가 클래스 물마루 리플렉션을 인스턴스화하려고 시도했기 때문입니다. 이 클래스는 추가 '보이지 않는'매개 변수가 필요하기 때문에 로컬 또는 내부 클래스를 사용할 때 문제가 발생합니다. (관련 질문 : How to instantiate inner class with reflection in Java?)

그래서 해결책은 Yelp 클래스와 YelpApi2 클래스를 자신의 파일로 추출하는 것입니다.