java-如何同时从两个或多个网站获取数据?(Android应用)

java-如何同时从两个或多个网站获取数据?(Android应用),第1张

概述我做了一个应用程序,它从不同的网址获取数据.我使用for循环使用jsoup lib从不同的URL获取数据.现在,这需要很多时间,例如5秒.首先从url1中获取数据,然后从2中获取数据,然后从3中获取数据.这就是我想的时间.所以我想知道我们是否可以同时(多个线程)从不同的URL获取数据?public class Title extends AsyncTask

我做了一个应用程序,它从不同的网址获取数据.我使用for循环使用Jsoup lib从不同的URL获取数据.现在,这需要很多时间,例如5秒.
首先从url1中获取数据,然后从2中获取数据,然后从3中获取数据.
这就是我想的时间.

所以我想知道我们是否可以同时(多个线程)从不同的URL获取数据?

public  class Title extends AsyncTask <String,VoID,VoID> {    String url,ver;    Bitmap mIcon11 = null;    ArrayList<App> appsList = new ArrayList<>();    @OverrIDe    protected VoID doInBackground(String ... strings) {        try {            for (String string : strings) {                document document = Jsoup.connect(string).get();                Elements a = document.select("div.AppCont");                Elements b = a.select("article");                Elements c = b.select("div.imgdiv");                Elements d = c.select("img");                url = d.attr("src");                inputStream in = new URL(url).openStream();                mIcon11 = BitmapFactory.decodeStream(in);                ver = b.get(0).text();                String z = string.replace("https://a2zapk.com/History/","");                z = z.replace("/","");                PackageInfo pi = getApplicationContext().getPackageManager().getPackageInfo((z),PackageManager.GET_Meta_DATA);                String versionname = pi.versionname;                ver = ver + " (Installed Version: " +versionname + ")";                appsList.add(new App(ver,mIcon11));            }        } catch (Exception e) {            e.printstacktrace();        }        return null;    }    @OverrIDe    protected voID onPostExecute(VoID result) {         add(appsList);    }
最佳答案您绝对可以,但是管理这些任务的线程可能会很棘手.我建议使用Rxava为您要从中获取数据的每个站点准备一个单独的可观察对象.然后使用merge或mergeDelayError将结果合并到单个Observable中,您可以在主线程上订阅该Observable来更新UI.

请查看RxJavaAndroid,以获取有关在AndroID主线程上订阅这些更新的帮助.

您需要熟悉RxJava的4个核心部分:

>您正在做什么-就您而言,这是从服务器获取数据
>哪个线程池正在运行此任务-我建议使用Schedulers.io(),它是专门为IO任务(例如,获取数据)预留的池.
>您要在哪个线程池上观察结果-AndroIDSchedulers.mainThread()是您想要的结果
>如何处理结果-更新某些UI等

使用RxJava看起来类似于以下内容(在Kotlin中)

// What you're doingObservable.fromCallable {    listofApps = parseAppsList(Jsoup.connect("server1.host.com"))    return@fromCallable listofApps}        // Where you're doing it        .subscribeOn(Schedulers.io())        // Where you're observing results        .observeOn(AndroIDSchedulers.mainThread())        // What you're doing with those results        .subscribe({ apps ->            appsList.addAll(apps)        },{ exception ->             // Show an error message        })

要同时获取多个结果并在每次完成时添加它们,您的代码应如下所示:

val fromServer1 = Observable.fromCallable {    listofApps = parseAppsList(Jsoup.connect("server1.host.com"))    return@fromCallable listofApps}        .subscribeOn(Schedulers.io())val fromServer2 = Observable.fromCallable {    listofApps = parseAppsList(Jsoup.connect("server2.host.com"))    return@fromCallable listofApps}        .subscribeOn(Schedulers.io())Observable.merge(fromServer1,fromServer2)        .observeOn(AndroIDSchedulers.mainThread())        .subscribe({ apps ->            // Note that this callback will be called once per server            appsList.addAll(apps)        },{ exception ->            // Show an error message        })
总结

以上是内存溢出为你收集整理的java-如何同时从两个或多个网站获取数据?(Android应用) 全部内容,希望文章能够帮你解决java-如何同时从两个或多个网站获取数据?(Android应用) 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1145075.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存