0

因此,我开始构建一个我已经在我的计算机上使用 JavaFX 为 android 编写的应用程序。我对android几乎是全新的。

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

我的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()

 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();
    }
}

整个过程都有效,我在我的 TextView 上显示了网站文本(而不是链接指向的文件中的文本 - 它是来自 Google Drive 的直接下载链接)。

但是:按下按钮的动画与文本同时出现,所以在我实际按下它之后大约 1 秒。我猜我在下载文件时仍然以某种方式让 UI-Thread 进入睡眠状态。

我怎样才能让按钮在按下时显示它的动画?

PS:我尝试与意图合作,但未能将数据从下载意图传输到UI ...执行它!

PPS:如果您对此代码有任何不满意的地方(线程问题、不良风格等),请随时告诉我。 当试图教自己一些东西时,批评是唯一的学习方式!

4

1 回答 1

3

这是滞后的,因为您正在阻塞 UI 线程,直到您webThread使用webThread.join();.

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

于 2016-01-20T18:43:24.403 回答