【问题标题】:Parse multiple Pages HTML using Jsoup for Android使用 Jsoup for Android 解析多个页面 HTML
【发布时间】:2017-04-16 06:24:06
【问题描述】:

我正在使用 Jsoup for Android 解析 html,使用 AsyncTask。 我用了很长时间,但今天我在解析与 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 个页面链接... 有人能帮我吗?非常感谢。祝你有美好的一天。

【问题讨论】:

  • Volley 怎么样?
  • 感谢您的回复。但也许它不包含像我说的队列一样的 Asynctask 中的分离任务,因为我在循环中使用多线程。 :(
  • 您能否详细说明您想要实现的目标以及到目前为止您已经尝试过的目标?尤其是你的意思是“我怎样才能解析所有这些,但必须适应 AsyncTask 的性质,它就像一个队列,等待一个直到它完成并开始一个新的”。
  • @aha :很抱歉让您感到困惑。特别是 AsyncTask 在任何 for 循环或 for 任何 while 循环中,所以当你想在新循环中使用新的 AsyncTask 时,等待旧的 AsyncTask 完成,就像队列一样。
  • @aha 但是,对于任何while或for循环,当前的AsyncTask执行都不会有等待时间,它直接测试改变的条件是否仍然有效重复,所以旧的 AsyncTask 和新的 AsyncTask 发生了冲突。

标签: android multithreading android-asynctask jsoup handler


【解决方案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
                    }
                });
    }
}

【讨论】:

    猜你喜欢
    • 2012-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-26
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    相关资源
    最近更新 更多