恢弘志士之气,不宜妄自菲薄。这篇文章主要讲述AsyncTask在android中加载数据的次数非常不同相关的知识,希望能为你提供帮助。
我写了这段代码来发送请求并从服务器获取数据。有时,2G互联网连接的加载过程需要2秒,但有时需要超过20秒的4G互联网连接。我必须考虑一下我没有做过的事吗?
这是我的代码
@Override
protected void onPreExecute() {
dialog.show();
new CountDownTimer(10000, 10000) {
public void onTick(long millisUntilFinished) {
}public void onFinish() {
// stop async task if not in progress
if (getStatus() == Status.RUNNING) {
Request.this.cancel(false);
activity.finish();
font.toast(activity.getResources().getString(R.string.connection_problem));
}
}
}.start();
super.onPreExecute();
}@Override
protected String doInBackground(String... params) {
if (isOnline())
try {data += params[1];
link += params[0];
URL url = new URL(link);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.connect();
BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(httpURLConnection
.getOutputStream()));
writer.write(data);
writer.flush();
int responseCode = httpURLConnection.getResponseCode();
if (responseCode == 200) {//if valid, read result from server
BufferedReader reader = new BufferedReader(new InputStreamReader
(httpURLConnection.getInputStream()));
String line;
StringBuilder stringBuilder = new StringBuilder();
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
}
return stringBuilder.toString();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
else {
dialog.cancel();
activity.runOnUiThread(new Runnable() {
@Override
public void run() {
font.toast(activity.getResources().getString(R.string.internet_connection_problem));
activity.finish();
}
});
}
return null;
}@Override
protected void onPostExecute(final String o) {
try {
if (o != null) {
dialog.cancel();
callBack.onResponse(new Response(o));
}
} catch (JSONException e) {
e.printStackTrace();
}
super.onPostExecute(o);
}
public static boolean isOnline() {
try {
int timeoutMs = 2500;
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);
sock.connect(sockaddr, timeoutMs);
sock.close();
return true;
} catch (IOException e) {
return false;
}
}
我使用post方法将请求发送到服务器(php),然后我收到结果。
我用isOnline方法检查互联网连接,并在onPerExecute方法中使用CountDownTimer设置超时。
无论如何要加快连接速度?我如何防止加载时间非常不同?
答案这里只是一个建议,当然你总是可以忽略我:)
【AsyncTask在android中加载数据的次数非常不同】为什么不使用Retrofit- > https://square.github.io/retrofit/,它非常简单直观。
推荐阅读
- Android AsyncTask无法运行
- Android Socket,AsyncTask,Handler内存泄漏
- 示例(使用AsyncTask的Android双向网络套接字)
- 如何在没有AppEngine for Google云端存储的情况下获取服务网址()
- 带有Gcloud错误的Rails((gcloud.preview.app.deploy)错误响应:[13]意外错误。部署版本:)
- 仅包含日期和月份的Android日期选择器
- 未捕获错误(模块“AppModule”导入的意外指令“MatFormField”。请添加@NgModule注释)
- 如何获得MONTHS,DAYS和周(android datepicker)
- 我需要在android.widget.datepicker中自定义月份名称