Android Java rxjava 线程抓取网页

2024-04-06

我必须抓取一个网页,我必须获取所有具有data-component-type等于s-search-result并将它们放入PC类型的ArrayList中,它具有一些属性。

但我不知道如何使用 Retrofit 进行解析。

有人可以帮我吗?

// RxJava library and RxAndroid for Android specific bindings
    implementation 'io.reactivex.rxjava2:rxjava:2.2.0'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'

    // Retrofit and OkHttp
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.okhttp3:okhttp:3.11.0'

    // RxJava retrofit adapter and Retrofit Gson converter
    implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

API服务

import io.reactivex.Flowable;
import retrofit2.http.GET;

public interface ApiService {
    @GET("/pc/s?k=pc")
    Flowable<Page> getPc();
}

Http客户端

import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;

import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class HttpClient {
    private static final String API_BASE_URL = "https://www.amazon.com/";

    private static Retrofit retrofit = new Retrofit.Builder()
            .baseUrl(API_BASE_URL)
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .addConverterFactory(GsonConverterFactory.create())
            .build();

    private static ApiService apiService = retrofit.create(ApiService.class);

    public static ApiService getApiService() {
        return apiService;
    }
}

MyWidget

import android.appwidget.AppWidgetManager;
import android.appwidget.AppWidgetProvider;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Log;
import android.widget.RemoteViews;

import io.reactivex.functions.Consumer;

public class MyWidget extends AppWidgetProvider {
    private ApiService apiService = HttpClient.getApiService();

    void updateAppWidget(Context context, AppWidgetManager appWidgetManager, int appWidgetId) {
        RemoteViews views = new RemoteViews(context.getPackageName(), R.layout.widget_design);

        //get the widget value
        SharedPreferences preferences = context.getSharedPreferences("PREFS", 0);
        int value = preferences.getInt("value", 1);

        //set the value in the textview
        views.setTextViewText(R.id.text, "" + value);

        //update the widget
        appWidgetManager.updateAppWidget(appWidgetId, views);

        //reschedule the widget refresh
        AlarmHandler alarmHandler = new AlarmHandler(context);
        alarmHandler.cancelAlarmManager();
        alarmHandler.setAlarmManager();


//Service http
        apiService.getPc()
                .observeOn(SchedulerProvider.ui())
                .subscribeOn(SchedulerProvider.io())
                .subscribe(new Consumer<Page>() {
                    @Override
                    public void accept(Page page) throws Exception {
                        // Update the UI
                        Log.d("WIDGET2", page.toString());
                    }
                }, new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        // Throw error
                        throwable.printStackTrace();
                    }
                });

        Log.d("WIDGET", "Widget updated!");
    }

    @Override
    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        for (int appWidgetId: appWidgetIds) {
            updateAppWidget(context, appWidgetManager, appWidgetId);
        }
    }

    @Override
    public void onDisabled(Context context) {
        //stop updating the widget
        AlarmHandler alarmHandler = new AlarmHandler(context);
        alarmHandler.cancelAlarmManager();

        Log.d("WIDGET", "Widget removed!");
    }

Page

import java.util.ArrayList;

class Pc {

    String name;
    String price;
    boolean sponsored;

    public String getFormattedInfo() {
        StringBuilder builder = new StringBuilder();
        builder.append("Name: " + name + "\n\n");
        builder.append("Price: " + price + "\n");
        builder.append("Sponsored: " + sponsored + "\n");

        return new String(builder);
    }
}

public class Page {

    String numberPc;

    ArrayList<Pc> arrayPc = new ArrayList<Pc>();

}

None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android Java rxjava 线程抓取网页 的相关文章

随机推荐