UI-下载数据时线程似乎滞后
UI-Thread seems to lag when downloading data
所以我开始构建一个应用程序,我已经在我的计算机上使用 JavaFX 为 android 编写了该应用程序。我对 android 几乎是全新的。
我现在苦恼的是顺利下载一个文件。
我的 MyActivity.java
class 中有以下代码:
/**
* 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();
}
}
一切正常,我得到网站文本(而不是 link 指向的文件中的文本 - 它是从 Google 驱动器直接下载 link)显示在我的 TextView.
但是: 按下按钮的动画与文本同时出现,所以在我实际按下按钮后大约 1 秒。 我猜 我在下载文件时仍然以某种方式让 UI-线程休眠。
如何让按钮在按下时显示动画?
PS:我尝试使用 intends,但无法将数据从 Downloading Intent 传输到 UI...如果有人有时间和精力得到一个有计划的解决方案,我会更乐意尝试理解和实施它!
PPS:如果您对这段代码还有其他不满意的地方(线程问题、不良风格等),请随时告诉我。
批评是自学的唯一途径!
这是滞后的,因为您正在阻塞 UI 线程,直到您的 webThread
使用 webThread.join();
完成。
考虑改用 AsyncTask
。它有一个方法doInBackground()
,你可以覆盖它来完成你所有的后台工作,然后一旦完成你就可以用onPostExecute(Result)
中的结果更新你的TextView
,因为那是运行 UI 给你的帖子。
所以我开始构建一个应用程序,我已经在我的计算机上使用 JavaFX 为 android 编写了该应用程序。我对 android 几乎是全新的。
我现在苦恼的是顺利下载一个文件。
我的 MyActivity.java
class 中有以下代码:
/**
* 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();
}
}
一切正常,我得到网站文本(而不是 link 指向的文件中的文本 - 它是从 Google 驱动器直接下载 link)显示在我的 TextView.
但是: 按下按钮的动画与文本同时出现,所以在我实际按下按钮后大约 1 秒。 我猜 我在下载文件时仍然以某种方式让 UI-线程休眠。
如何让按钮在按下时显示动画?
PS:我尝试使用 intends,但无法将数据从 Downloading Intent 传输到 UI...如果有人有时间和精力得到一个有计划的解决方案,我会更乐意尝试理解和实施它!
PPS:如果您对这段代码还有其他不满意的地方(线程问题、不良风格等),请随时告诉我。 批评是自学的唯一途径!
这是滞后的,因为您正在阻塞 UI 线程,直到您的 webThread
使用 webThread.join();
完成。
考虑改用 AsyncTask
。它有一个方法doInBackground()
,你可以覆盖它来完成你所有的后台工作,然后一旦完成你就可以用onPostExecute(Result)
中的结果更新你的TextView
,因为那是运行 UI 给你的帖子。