使用Jsoup for Android解析多个页面HTML

时间:2017-04-16 06:24:06

标签: android multithreading android-asynctask jsoup handler

我使用AsyncTask使用Jsoup for Android解析html。 我使用它很长一段时间了,但今天我解决了与RecyclerView适配器有关的多个页面的问题,具体:https://www.hi.com?page=1;和https://www.hi.com?page=2,...... 页数不小,大于100。 我如何解析所有这些,但必须适应像队列一样的AsyncTask的性质,等待它直到完成并开始一个新的。 我尝试使用for (int i=1;i<=countPage;i++) { //do new AsyncTask with new String that String change by the last word present by count ( ...?page=" + String.valueOf(countPage)... } 但它不起作用。 我试过Thread,在里面设置AsynTask直到getStatus = AsyncTask.Status == Done和new Parse,但直到不工作。 我尝试使用ThreadPool,但直到不工作。我不知道如何解决这个问题。 我不想列出页面的所有100个链接... 有人能帮我吗?谢谢你。祝你有愉快的一天。

1 个答案:

答案 0 :(得分:1)

要同时多次执行AsyncTask,您必须将变体与执行者一起使用,并且创建多个实例:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        for (String param : new String[] {"foo", "bar", "baz"}) {
            new SomeTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, param);
        }
    }

    static class SomeTask extends AsyncTask<String, Long, String> {

        @Override
        protected String doInBackground(String... params) {
            // do your background processing
            return null;
        }
    }
}

就个人而言,我更喜欢RxJava。使用起来更愉快。 RxJava中的等效代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Observable.just("foo", "bar", "baz")
                .map(new Function<String, String>() {
                    @Override
                    public String apply(String s) throws Exception {
                        // Background processing
                        return null;
                    }
                })
                .subscribeOn(Schedulers.computation())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        // display result
                    }
                });
    }
}