在Android开发中有时候会遇到如题这样的问题,但是在别的手机上调试的时候这个异常不会被抛出,晚上查了资料,原来是Android4.0以后不能在主线程中请求HTTP请求。这个设计是为了防止网络请求时间过长而导致界面假死的情况。解决办法:用线程来操作网络请求。
private class historyThread implements Runnable {
public void run(){
SoapObject gg=getTransformDataSimple();
if(gg!=null){
parserTransformData(gg);
Message msg = Message.obtain();
msg.what=1;
handler.sendMessage(msg);
}
}
}
private void QueryBtn(){
mProgressBar.setVisibility(View.VISIBLE);
mQueryBtn.setBackgroundColor(color.transparent);
new Thread(new historyThread()).start();
TimerTask task = new TimerTask(){
public void run() {
Message message = new Message();
message.what = 404;
handler.sendMessage(message);
}
};
Timer timer = new Timer();
timer.schedule(task, 10000); //超时10秒
}
Handler handler=new Handler(){
public void handleMessage(android.os.Message msg) {
if(IS_NETWORK_ERROR){
Toast.makeText(mContext, "网络信号异常", Toast.LENGTH_LONG).show();
//为了下次验证重新设置为false
IS_NETWORK_ERROR=false;
mProgressBar.setVisibility(View.INVISIBLE);
}else{
switch(msg.what){
case 1:
mProgressBar.setVisibility(View.INVISIBLE);
mQueryBtn.setVisibility(View.VISIBLE);
mQueryBtn.setBackgroundResource(R.drawable.button_selector);
Toast.makeText(mContext, "查询完毕", Toast.LENGTH_SHORT).show();
mHistoryData.setVisibility(View.VISIBLE);
mLinearLayout.setVisibility(View.INVISIBLE);
SimpleAdapter adapter=new SimpleAdapter(mContext, mData, R.layout.mlist_history,
new String[]{"datatime","installlocal","destoried",
"moved","shocked","approached"},
new int[]{R.id.textview_datatime,R.id.textview_installlocal,
R.id.textview_destoried,R.id.textview_moved,R.id.textview_shocked,
R.id.textview_approached});
mHistoryData.setAdapter(adapter);
break;
case 404:
mProgressBar.setVisibility(View.INVISIBLE);
break;
default :
break;
}
}
}
};