Java UI线程在下载数据时似乎滞后

Java UI线程在下载数据时似乎滞后,java,android,multithreading,javafxports,Java,Android,Multithreading,Javafxports,因此,我开始建立一个应用程序,我已经在我的android电脑上使用JavaFX编程。我对安卓系统几乎完全陌生 我现在正在努力的是顺利下载一个文件 我的MyActivity.java类中有以下代码: /** * Called when the user clicks the getWebsite button */ public void getWebsite(View view) { WebReader web = new WebReader(URL); Thread we

因此,我开始建立一个应用程序,我已经在我的android电脑上使用JavaFX编程。我对安卓系统几乎完全陌生

我现在正在努力的是顺利下载一个文件

我的
MyActivity.java
类中有以下代码:

/**
 * Called when the user clicks the getWebsite button
 */
public void getWebsite(View view) {

    WebReader web = new WebReader(URL);
    Thread webThread = new Thread(web);
    webThread.start();
    try {
        webThread.join();
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(web.getWebsite());
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}
WebReader实现了Runnable。在
public void run()
上调用以下方法:

整个过程都很顺利,我的文本视图上显示了网站文本(而不是链接指向的文件中的文本——这是一个从Google Drive直接下载的链接)

但是:按下按钮的动画与文本同时出现,所以在我实际按下按钮后大约1秒钟我猜在下载文件时,我仍然以某种方式使UI线程处于休眠状态

按下按钮时,如何使其显示动画?

PS:我尝试了使用意图,但未能将数据从下载意图传输到UI。。。如果有人有时间和精力去解决问题,我会非常乐意去理解和实施它

PPS:如果你对这段代码还有什么不喜欢的地方(线程问题、糟糕的风格等等),请毫不犹豫地告诉我。
当你试图教自己一些东西时,批评是唯一的学习方式

它是滞后的,因为您正在阻止UI线程,直到您的
webThread
使用
webThread.join()完成


改为使用
AsyncTask
。它有一个方法
doInBackground()
您可以覆盖以完成所有后台工作,然后完成后,您可以在
onPostExecute(Result)中使用结果更新您的
TextView
因为它是在UI线程上为您运行的。

它是滞后的,因为您正在阻止UI线程,直到您的
webThread
使用
webThread.join()完成


改为使用
AsyncTask
。它有一个方法
doInBackground()
您可以覆盖以完成所有后台工作,然后完成后,您可以在
onPostExecute(Result)中使用结果更新您的
TextView
因为它是在UI线程上为您运行的。

使用
异步任务
替代:使用
异步任务
替代:但是我必须从扩展
异步任务
的类中更新TextView,不是吗?是的,但通常
AsyncTask
是使用它的内部类,因此您可以访问需要更新的
TextView
。不过,我想用下载的内容更新不同的TextView。这将创造一个内部阶级的丛林…:(此任务是否需要在多个不同的活动或片段中运行,或者所有的
TextView
s是否在同一布局中?如前所述,刚开始…主要目标是在启动时加载所有内容(但目前我与此相去甚远)对于这个问题,我们假设它们都在同一个布局中。但是我必须从扩展
AsyncTask
的类中更新TextView,不是吗?是的,但是通常
AsyncTask
是一个使用它的内部类,因此您可以访问需要更新的
TextView
。我想更新d不同的TextView与下载的内容不同。这将创建一个内部类的丛林…:(此任务需要在多个不同的活动或片段中运行,还是所有
TextView
s都在同一布局中?如前所述,刚开始…主要目标是在启动时加载所有内容(但我现在离这一点还有一段距离)。因此,对于这个问题,让我们假设它们都在同一个布局中。
 private void getWebsite(String URL) {
    BufferedReader in = null;
    String line = "";
    java.net.URL myUrl = null;
    try {
        myUrl = new URL(URL);
    in = new BufferedReader(new InputStreamReader(myUrl.openStream(), "UTF-8"));
    while ((line = in.readLine()) != null) {
        toReturn = toReturn + "\n" + line;
    }
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}