首先我们知道Android3.0 之后已经不允许在主线程中访问网络了,我们在访问网络时必须要新建一个线程去执行,但是这样的话请求返回的响应在另一个线程中,我尝试过使用全局静态变量等等其他,最后还是使用Handler解决的问题。
注明:Android开发小白,可能这不是特别好的方法,但是亲测有效。
首先在主线程内写一个Handler
- private boolean registerUser(User user) {
- //准备JSON数据
- JSONStringer jsonText= new JSONStringer();
- try {
- jsonText.object();
- jsonText.key("account");
- jsonText.value(user.getAccount());
- jsonText.key("password");
- jsonText.value(user.getPassword());
- jsonText.endObject();
- } catch (JSONException e) {
- e.printStackTrace();
- }
- //准备Handler负责传递消息
- Handler handler=new Handler(){
- @Override
- public void handleMessage(@NonNull Message msg) {
- super.handleMessage(msg);
- Response s=(Response)msg.obj;
- try {
- Log.e("sd",ss.body().string()); //打印响应的body
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- };
- //调用post方法,将JSON数据发送
- Network.postSync(jsonText.toString(),handler); //自己写的工具类,用于post请求
- return true;
- }
POST请求方法:
这是我写的一个工具类,url是指定的一个地址,我用的全局变量。
- public static void postSync(String json,Handler handler){
- new Thread(){
- @Override
- public void run() {
- //准备请求体
- RequestBody body=RequestBody.create(MediaType.parse("application/json"),json);
- //准备请求
- Request request=new Request.Builder().url(url).post(body).build();
- Call call=okHttpClient.newCall(request);
- Response response=null;
- try {
- //通过Handler传递消息
- Message message=Message.obtain();
- message.what=123;
- message.obj=call.execute();
- handler.sendMessage(message);
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }.start();
- }