【问题标题】:Interfaces don't retrieve data from Last.fm Api接口不从 Last.fm Api 检索数据
【发布时间】:2019-01-25 02:13:56
【问题描述】:

我在运行应用程序时没有任何类型的错误,但问题是我没有从我的界面检索数据。 我使用 Dagger 注入依赖项,并进行改造以从 Last.fm Api 检索数据。

当我尝试使用日志检查数据是否为空时,该消息不会显示在 logcat 中,并且不适用于 toast 消息。

服务接口

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();
    }
}
}

这是我的模块类,用于向我的主要活动注入依赖项 @模块 公共类 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”方法中的数据。

【问题讨论】:

  • 你从不打电话给.enqueue(),而且这些数据类型似乎不匹配。
  • @MartinZeitler,他不需要那个,他使用了改造 + rxjava2 设置 + 已经包含了一些工厂。
  • @joshuadeguzman 改造不要求......而且问题通常缺少 POJO。
  • 嗨@MartinZeitler,我想你可以看看这个square.github.io/retrofit/2.x/retrofit/retrofit2/….enqueue() 是当你使用Retrofit 的Call 回调时可用的方法,否则如果你更喜欢使用Retrofit 和RxJava ,你可能不需要。阅读更多:randomdotnext.com/retrofit-rxjava
  • @Dskato 你能告诉我们你是如何序列化响应的吗(向我们展示你的模型对象)?

标签: java android retrofit dagger-2 last.fm


【解决方案1】:

首先建议你添加改造客户端拦截器 在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 返回的响应。如果响应返回正确,请检查您的实施

【讨论】:

  • 这是在我的模块注入中,请阅读评论,我认为是 webService 的问题
猜你喜欢
  • 2013-12-17
  • 2021-09-08
  • 2015-06-11
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
相关资源
最近更新 更多