我遇到线程问题。当我尝试用TextView编写成功下载百分比时,它根本不会更新它,直到最后(直到收到所有内容)为止,最后只显示100。
似乎它实际上并未在其他线程中运行...
我尝试在控制台中使用日志记录,而不是使用 publishProgress ,它可以工作。似乎 MainActivity 被冻结,直到完成下载任务。
public class DownloadTask extends AsyncTask<String, Integer, String> {
@Override
protected String doInBackground(String... urls) {
String result = "";
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL(urls[0]);
urlConnection = (HttpURLConnection)url.openConnection();
InputStream in = urlConnection.getInputStream();
InputStreamReader reader = new InputStreamReader(in);
int count = 0;
int size = 0;
while (reader.read() != -1) {
size++;
}
urlConnection = (HttpURLConnection)url.openConnection();
in = urlConnection.getInputStream();
reader = new InputStreamReader(in);
int data = reader.read();
while (data != -1) {
char current = (char) data;
result += current;
int progress = (int) (((float) count++ / (float) size) * 100);
publishProgress(progress);
data = reader.read();
}
return result;
}
catch(Exception e) {
e.printStackTrace();
return "Failed";
}
}
@Override
protected void onProgressUpdate(Integer... values) {
textView.setText((values[0]).toString());
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.text);
DownloadTask task = new DownloadTask();
String result = null;
try {
result = task.execute("https://stackoverflow.com/").get();
}
catch (Exception e) {
e.printStackTrace();
}
Log.i("Contents Of URL", result);
}
请帮忙吗?
答案 0 :(得分:1)
您正在根据docs在ASyncTask中使用get方法。
在必要时等待计算完成,然后检索 其结果。
这意味着您告诉异步任务同时运行。
要使其异步运行,请不要使用get方法。
task.execute("https://stackoverflow.com/")
并使用onPostExecute检索结果:
protected void onPostExecute(String result) {
}