下载数据时,UI-Thread似乎滞后

时间:2016-01-20 18:29:09

标签: java android multithreading javafxports

所以我开始构建一个应用程序,我已经在我的计算机上使用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云端硬盘的直接下载链接)。

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

如何在按下按钮时让按钮显示动画?

PS:我尝试使用打算,但未能将数据从下载Intent 传输到 UI ...如果有人有时间和精力来获得有意向的解决方案我会更乐意尝试理解和实施它!

PPS:如果还有其他任何你不喜欢这个代码(线程问题,糟糕的风格等),请不要犹豫告诉我。  批评是尝试自学的唯一途径!

1 个答案:

答案 0 :(得分:3)

这是滞后的,因为您使用webThread阻止了UI线程,直到webThread.join();完成。

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