链接地址:http://blog.csdn.net/koterror/article/details/9056059
4.0之后在主线程里面执行网络请求都会报这个错,最好采用新起一个线程的方法解决,
我的程序是从一个网站上面爬下来一个登录页,代码如下:
1) onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
veriTextView = (TextView) findViewById(R.id.login_textview_veri_value);
veriEditText = (EditText) findViewById(R.id.login_edittext_verification);
new Thread(runnable).start();
}
2)android.os.Handler
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle data = msg.getData();
String verificationString = data.getString("verification");
veriTextView.setText(verificationString);
}
};
使用Handler的原因主要是,我要对UI的组件进行值设定,主线程以外不允许碰UI中的东东,所以使用handlemessage回调函数中调用更新界面。
3)java.lang.Runnable
Runnable runnable = new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
BufferedReader reader = null;
Message msg = new Message();
Bundle data = new Bundle();
try {
URL url = new URL("http://***.***.com.cn/");
URLConnection urlConnection = url.openConnection();
reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String lineString = null;
while ((lineString = reader.readLine()) != null) {
if (lineString.contains("input") && lineString.contains("yanzhengma")) {
int index = lineString.indexOf("value");
String verification = lineString.substring(index+7, index+12);
data.putString("verification", verification);
msg.setData(data);
handler.sendMessage(msg);
break;
}
}
reader.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} // run
};
以上,问题解决了。
不过,这里还有一个隐患,就是:
Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Bundle data = msg.getData();
String verificationString = data.getString("verification");
veriTextView.setText(verificationString);
}
};
中的 new Handle() 会显示警告,内容是: “This Handler class should be static or leaks might occur”
为了消除这个警告,只能采用static,并且采用弱引用,ADT要求static 也是怕内存泄露吧,修改 2)为静态类,并添加4)
新 2)
static class MyHandler extends Handler {
WeakReference<MainActivity> mActivity;
public MyHandler( MainActivity activity) {
// TODO Auto-generated constructor stub
mActivity = new WeakReference<MainActivity>(activity);
}
@Override
public void handleMessage(Message msg) {
MainActivity activity = mActivity.get();
Bundle data = msg.getData();
String verificationString = data.getString("verification");
activity.veriTextView.setText(verificationString);
} // handleMessage
}
4)在 3)前面
private MyHandler myHandler = new MyHandler(this);