Интерфейсы не получают данные из Last.fm Api - PullRequest
0 голосов
/ 25 января 2019

У меня нет никаких типов ошибок при запуске приложения, но проблема в том, что я не получаю данные из моего интерфейса. Я использую Dagger для внедрения зависимостей и модифицирую для извлечения данных из Last.fm Api.

Когда я пытаюсь использовать журнал, чтобы проверить, являются ли данные нулевыми, сообщение не отображается в logcat и не работает с тостовым сообщением.

Сервисный интерфейс

public interface GenreTopTracksService {
  @GET("?method=tag.gettoptracks&format=json")
  Single<GenreTopTracksResponse> getGenreTopTracks(@Query("tag") String user, @Query("limit") int limit, @Query("api_key") String apiKey);
}

Интерфейс ведущего

public interface GenreTopTracksPresenter {
  void getGenreTopTracks(String tag, int limit, String apiKey);
}

Интерфейс интерактора

public interface GenreTopTracksInteractor {
  Single<GenreTopTracksResponse> getGenreTopTracks(String tag, int limit, String apiKey);
}

Просмотр интерфейса - здесь у меня есть метод обновления данных

public interface GenreTopTracksView {
  void updateData(List<Track> tracks);
}

этот класс является реализацией GenreTopTrackPresneter

public class GenreTopTracksPrensenterImpl implements GenreTopTracksPresenter {


Disposable mDisposable;
GenreTopTracksInteractor mInteractor;
GenreTopTracksView mGenreViewData;


public GenreTopTracksPrensenterImpl(GenreTopTracksInteractor mInteractor, GenreTopTracksView mGenreViewData) {
    this.mInteractor = mInteractor;
    this.mGenreViewData = mGenreViewData;
}

@Override
public void getGenreTopTracks(String tag, int limit, String apiKey) {
    disposeRequest();
    mDisposable = mInteractor.getGenreTopTracks(tag, limit, apiKey)
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .map(new Function<GenreTopTracksResponse, List<Track>>() {
                @Override
                public List<Track> apply(@NonNull GenreTopTracksResponse topTracksResponse) throws Exception {
                    if (topTracksResponse != null && topTracksResponse.getTopTracks() != null && topTracksResponse.getTopTracks().getTracks() != null) {
                        return topTracksResponse.getTopTracks().getTracks();
                    }
                    return new ArrayList<Track>();
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<List<Track>>() {
                @Override
                public void accept(@NonNull List<Track> tracks) throws Exception {

                    if (tracks.size() == 0) {
                        // NO se muestra nada
                    }else{
                     mGenreViewData.updateData(tracks);
                    }

                }
            }, new Consumer<Throwable>() {
                @Override
                public void accept(@NonNull Throwable throwable) throws Exception {
                    Log.d("ERRORGENRE", "Errorxd");

                }
            });
}


private void disposeRequest() {
    if (mDisposable != null && !mDisposable.isDisposed()) {
        mDisposable.dispose();
    }
}
}

Это мой класс модуля для добавления зависимостей в мою основную деятельность @Module открытый класс GenreTopTracksModule {

GenreTopTracksView mView;

public GenreTopTracksModule(GenreTopTracksView view) {
    mView = view;

}

// provides the view to create the top tracks presenter
@Singleton
@Provides
public GenreTopTracksView providesTopTracksView() {
    return this.mView;
}

// provides a converter factory to create the retrofit instance
@Singleton
@Provides
public Converter.Factory providesConverterFactory() {
    return GsonConverterFactory.create();
}

// provides a call adapter factory needed to integrate rxjava with retrofit
@Singleton
@Provides
public CallAdapter.Factory providesCallAdapterFactory() {
    return RxJava2CallAdapterFactory.create();
}

// provides a retrofit instance to create the top tracks interactor
@Singleton
@Provides
public Retrofit providesRetrofit(Converter.Factory converter, CallAdapter.Factory adapter) {
    return new Retrofit.Builder()
            .baseUrl(Constants.BASE_URL)
            .addCallAdapterFactory(adapter)
            .addConverterFactory(converter)
            .build();
}

// provides top tracks interactor to make an instance of the presenter
@Singleton
@Provides
public GenreTopTracksInteractor providesTopTopTracksInteractor(Retrofit retrofit) {
    return new GenreTopTracksInteractorImplementation(retrofit);
}

// provides top track presenter
@Singleton
@Provides
public GenreTopTracksPresenter providesTopTracksPresenter(GenreTopTracksInteractor interactor, GenreTopTracksView mView) {
    return new GenreTopTracksPrensenterImpl(interactor, mView);

}
}

А это мое основное занятие

public class SelectionActivity extends AppCompatActivity implements GenreTopTracksView{


@Inject
GenreTopTracksPresenter mPresenter;
Button mButton;
EditText mEditText;
String tag;



@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_selection);
    DaggerGenreTopTracksComponent.builder().genreTopTracksModule(new GenreTopTracksModule(this)).build().inject(this);
    mButton = (Button) findViewById(R.id.button_prueba);
    mEditText = (EditText) findViewById(R.id.edit_prueba);

    mButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            tag = mEditText.getText().toString();
            mPresenter.getGenreTopTracks(tag, Constants.TOP_ITEMS_LIMIT, Constants.API_KEY);

        }
    });

}


@Override
public void updateData(List<Track> tracks) {

    if(tracks != null){
        for(int x = 0; x<tracks.size(); x++){
            Log.d("datasetTrack", tracks.get(x).getName());
            Toast.makeText(SelectionActivity.this, tracks.get(x).getName(), Toast.LENGTH_SHORT).show();

        }
    }else if(tracks == null){
        Log.d("datasetTrack", "datos nulos :(");
        Toast.makeText(SelectionActivity.this, "Datos nulos", Toast.LENGTH_SHORT).show();
    }

}
}

Мне нужно увидеть данные в методе "updateData".

1 Ответ

0 голосов
/ 25 января 2019

Прежде всего рекомендуем добавить модифицированный клиентский перехватчик. Добавить зависимость в build.gradle :

compile 'com.squareup.okhttp3:logging-interceptor:$your_version'

в GenreTopTrackModule изменить метод

@Singleton
@Provides
public Retrofit providesRetrofit(Converter.Factory converter, CallAdapter.Factory adapter) {
    HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
    interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
    OkHttpClient client = new OkHttpClient.Builder().addInterceptor(interceptor).build();
    return new Retrofit.Builder()
           .client(client)
           .baseUrl(Constants.BASE_URL)
           .addCallAdapterFactory(adapter)
           .addConverterFactory(converter)
           .build();
}

В результате в Logcat вы увидите ответ, который возвращает last.fm api.Если ответ верен правильно, проверьте вашу реализацию

...