安卓访问网络超时闪退? 安卓如何访问网络?
使用HttpURLConnection发送请求获取返回数据,网络连接请求超时会发生闪退。
可能的原因有两种
- 返回的网络连接为空,后续通过该连接调用获取返回码或者获取返回数据等方法时会发生空指针错误造成程序闪退。
- 用户连续请求用户导致等待访问的线程积累很多,如果十秒等不到反应,系统会认定该APP进程是僵尸进程,直接干掉也会导致闪退。
解决方法
写一个联网工具封装联网的操作,在这个操作中捕获超时异常,如果捕获到了提示用户网络超时,不要频繁请求。
当然如果用户硬要频繁请求,也没关系。关闭连接后返回一个空值,在访问网络子线程中判断,如果为空直接返回不再继续执行代码,关闭线程。
访问网络工具类的方法中捕获异常:
在访问网络子线程中调用了网络工具类中的发送请求的方法,如果返回的conn为空,直接返回,关闭子线程。
下面给出完整的联网工具类
package com.example.littlearrangement.Util;
import android.app.Activity;
import android.util.Log;
import android.widget.Toast;
import java.io.IOException;
import java.io.OutputStream;
import java.net.*;
public class HTTPUtil {
private static HttpURLConnection conn = null;
// 使用http协议发送请求并获取返回数据,参数是请求的参数以及请求的服务
public static HttpURLConnection sendDataByHttp(final Activity context, String data, String serve){
try{
// 1、生成URL对象
String path = "http://xxx.abc.def/"+serve;
URL url = new URL(path);
// 2、生成连接对象
conn = (HttpURLConnection)url.openConnection();
// 3、设置请求方式 get表示获取数据;post表示提交数据
conn.setRequestMethod("POST");
// 4、设置超时信息、允许输入输出
conn.setReadTimeout(4000);//设置超时信息
conn.setConnectTimeout(4000);//设置超时信息
conn.setDoInput(true);//设置输入流,允许输入
conn.setDoOutput(true);//设置输出流,允许输出
// 5、设置提交的参数,键值对形式,&隔开
System.out.println(data); // 调试输出
// 6、获取输出流
OutputStream out = conn.getOutputStream();
// 7、将提交的参数以字节形式写入输出流
out.write(data.getBytes());
out.flush();//刷新,将数据缓冲区中的数据全部输出,并清空缓冲区输出流并释放与流相关的资源
out.close();//关闭
} catch (ProtocolException e) {
e.printStackTrace();
}catch ( SocketTimeoutException e){ // 捕获网络访问超时异常,一旦捕获到就会返回空值
e.printStackTrace();
Log.v("login", "网络连接失败");
context.runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "网络连接失败", Toast.LENGTH_SHORT).show();
}
});
conn.disconnect(); // 关闭连接
return null;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return conn;
}
}
以及使用该工具类的一个实例
要注意,需要在子线程中访问网络,因为访问网络是费时操作
// 访问网络
new Thread(new Runnable() {
@Override
public void run() {
String data = "action=add&from=android&name="+user.getUserName()+"&content="+context+"&type="+importance;
Log.v("login", data);
HttpURLConnection conn = HTTPUtil.sendDataByHttp(AddToDoListActivity.this, data, "todolist");
if (conn == null){ // 网络连接失败,返回
return;
}
try{ // 访问成功
// 8、获取http状态返回代码,200表示成功
int code = conn.getResponseCode();
// 9、成功处理,获取输入流
if (code == 200){
Log.v("login","成功处理");
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
StringBuilder response = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
response.append(line);
Log.v("login", "读到了数据:"+response.toString());
if (response.toString().equals("添加成功")){
Log.v("login","添加成功:"+code);
}else{
Log.v("login", "添加失败");
}
}
conn.disconnect();
}else{
Log.v("login","返回错误码:"+code);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
如果你还想了解安卓端如何获取网页端传过来对象的话,请点击
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
二维码