在 android 中从服务器下载内容时屏幕冻结
Screen freezes when downloading content from server in android
我正在从 MainActivity 中的服务器下载 JSON 内容,并将 JSON 从 MainActivity 传递到 ListActivity,这里的问题是我在后端服务器中添加了 10 秒的休眠时间,即 Php 从哪里获取数据。因为,响应会延迟,我希望屏幕打开并等待响应到来并移动到下一个屏幕。
但是发生的事情是屏幕完全进入 white/black 直到收到响应并加载 ListActivity,这里的问题是 MainActivity 永远不可见。下面是相同的代码:
MainActivity
JSONData jsonData = new JSONData();
String jsonList = jsonData.fetchList();
Intent intent = new Intent(getApplicationContext(),ListActivity.class);
intent.putExtra("jsonList",jsonList);
startActivity(intent);
finish();
JSON数据class
public String fetchList() {
try {
String list = new DownloadJSONData().execute(listURL).get().toString();
return list;
} catch (Exception e) {
return "";
}
}
private class DownloadJSONData extends AsyncTask<String, String, String> {
protected void onPreExecute() {
super.onPreExecute();
}
protected String doInBackground(String... params) {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL(params[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream stream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(stream));
StringBuffer buffer = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line + "\n");
}
return buffer.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return "";
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
您正在使用 get() 方法,该方法会占用主线程或 ui 线程直到异步任务完成
您应该避免使用 get(),也可以使用 onPreExecute 中的进度对话框来显示对用户的网络调用进度
我正在从 MainActivity 中的服务器下载 JSON 内容,并将 JSON 从 MainActivity 传递到 ListActivity,这里的问题是我在后端服务器中添加了 10 秒的休眠时间,即 Php 从哪里获取数据。因为,响应会延迟,我希望屏幕打开并等待响应到来并移动到下一个屏幕。 但是发生的事情是屏幕完全进入 white/black 直到收到响应并加载 ListActivity,这里的问题是 MainActivity 永远不可见。下面是相同的代码:
MainActivity
JSONData jsonData = new JSONData();
String jsonList = jsonData.fetchList();
Intent intent = new Intent(getApplicationContext(),ListActivity.class);
intent.putExtra("jsonList",jsonList);
startActivity(intent);
finish();
JSON数据class
public String fetchList() {
try {
String list = new DownloadJSONData().execute(listURL).get().toString();
return list;
} catch (Exception e) {
return "";
}
}
private class DownloadJSONData extends AsyncTask<String, String, String> {
protected void onPreExecute() {
super.onPreExecute();
}
protected String doInBackground(String... params) {
HttpURLConnection connection = null;
BufferedReader reader = null;
try {
URL url = new URL(params[0]);
connection = (HttpURLConnection) url.openConnection();
connection.connect();
InputStream stream = connection.getInputStream();
reader = new BufferedReader(new InputStreamReader(stream));
StringBuffer buffer = new StringBuffer();
String line;
while ((line = reader.readLine()) != null) {
buffer.append(line + "\n");
}
return buffer.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
}
try {
if (reader != null) {
reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return "";
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
}
}
您正在使用 get() 方法,该方法会占用主线程或 ui 线程直到异步任务完成
您应该避免使用 get(),也可以使用 onPreExecute 中的进度对话框来显示对用户的网络调用进度