參考 博客
如果 把網絡請求放在 主線程中,android發送請求時會報錯 android.os.NetworkOnMainThreadException
我的處理方法是, 單獨用一個 類發送 網絡請求,這個類 extends Thread,代碼如下
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import net.sf.json.JSONObject;
import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicHeader;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
//import org.json.JSONObject;
/**
* 網絡訪問
* Created by lyh on 2019/6/6.
*/
public class NetThread extends Thread{
private static final String url_prefix ="url地址";
private String url;
private JSONObject json;
private JSONObject json_get;
private Handler handler;
public NetThread(String url_suffix, Handler handler,JSONObject json){
this.url=url_prefix+url_suffix;
this.handler=handler;
this.json=json;
}
@Override
public void run(){
super.run();
json_get=post(json);
if(json_get!=null){
Log.e("json_get",json_get.toString());
}
dealResult();
}
public void dealResult(){
/*
返回結果
*/
Message message = new Message();
message.what=1;
if(json_get==null){
message.what=0;
}
message.obj = json_get;
handler.sendMessage(message);
}
....
}
在 Activity 中通過 handler處理 結果,代碼如下
public void func(){
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
JSONObject jo=(JSONObject)msg.obj;
if (msg.what==1) {
try{
if((jo.getString("state")).equals("ok")){
// 處理成功的結果
}else{
// 處理失敗的結果
}
}catch(Exception e){
// 處理失敗的結果
}
}
}
};
/*
放數據
*/
JSONObject jo=new JSONObject();
jo.put("username",username);
jo.put("pwd",pwd);
// Log.e("json",jo.toString());
final NetThread netThread=new NetThread("register",handler,jo);
netThread.start();
}