1. 程式人生 > >okHttp的基本使用及2種請求方式和各方法的同步非同步實現

okHttp的基本使用及2種請求方式和各方法的同步非同步實現

一、效果
在這裡插入圖片描述
二、佈局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <EditText
        android:id="@+id/qq_number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:hint="請輸入qq號:"/>

    <EditText
        android:id="@+id/pwd_number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="15dp"
        android:hint="請輸入密碼:"/>

    <Button
        android:id="@+id/login"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="POST非同步登入"/>

    <Button
        android:id="@+id/login_post"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="POST同步登入"/>

    <Button
        android:id="@+id/login_getasy"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Get非同步登入"/>

    <Button
        android:id="@+id/login_getsy"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Get同步步登入"/>

    <TextView
        android:id="@+id/result"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="log.."
        android:textSize="25sp"
        android:textColor="#000"/>

</LinearLayout>

三、MainActivity程式碼,需要注意的就是我的介面已經用不了了需要自己創或找介面

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private String strUrl = "http://169.254.53.96:8080/web/LoginServlet" ;

    private EditText mQq;
    private EditText mPwd;
    private TextView mResultText;
    private FormBody mFormBody;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控制元件
        initView();
    }

    private void initView() {
        mQq = findViewById(R.id.qq_number);
        mPwd = findViewById(R.id.pwd_number);
        mResultText = findViewById(R.id.result);

        Button login = findViewById(R.id.login);
        login.setOnClickListener(this);
        Button login_post = findViewById(R.id.login_post);
        login_post.setOnClickListener(this);

        Button login_getasy = findViewById(R.id.login_getasy);
        login_getasy.setOnClickListener(this);
        Button login_getsy = findViewById(R.id.login_getsy);
        login_getsy.setOnClickListener(this);

    }

    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.login:

                //post非同步請求
                specific();

                break;

            case R.id.login_post:

                //post同步請求
                lpSpecific();

                break;

            case R.id.login_getasy:

                //get非同步
                getAsy();

                break;

            case R.id.login_getsy:
                //get同步
                getSy();
                break;
        }
    }
    //get同步
    private void getSy() {

        //獲取文字輸入的資訊進行非空判斷
        final String qq = mQq.getText().toString().trim();
        final String pwd = mPwd.getText().toString().trim();

        if(TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)){
            Toast.makeText(this, "使用者名稱或密碼不能為空", Toast.LENGTH_SHORT).show();
            return;
        }


        new Thread(new Runnable() {
            @Override
            public void run() {
                OkHttpClient client = new OkHttpClient.Builder()
                        .readTimeout(8, TimeUnit.SECONDS)
                        .connectTimeout(8, TimeUnit.SECONDS)
                        .build();
                Request request = new Request.Builder()
                        .url("http://169.254.53.96:8080/web/LoginServlet?qq=" + qq + "&pwd=" + pwd)
                        .build();
                Call call = client.newCall(request);
                try {
                    Response response = call.execute();
                    //注意string和tostring的區別
                    final String string = response.body().string();
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            mResultText.setText(string);
                        }
                    });
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }).start();

    }

    //get非同步
    private void getAsy() {

        //獲取文字輸入的資訊進行非空判斷
        String qq = mQq.getText().toString().trim();
        String pwd = mPwd.getText().toString().trim();

        if(TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)){
            Toast.makeText(this, "使用者名稱或密碼不能為空", Toast.LENGTH_SHORT).show();
            return;
        }

        //建立okHttpClient
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(8, TimeUnit.SECONDS)
                .readTimeout(8, TimeUnit.SECONDS)
                .build();


        //建立request
        Request request = new Request.Builder().url("http://169.254.53.96:8080/web/LoginServlet?qq="+ qq + "&pwd=" +pwd).build();

        //建立call物件
        Call call = client.newCall(request);

        call.enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "請求錯誤", Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final String string = response.body().string();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mResultText.setText(string);
                    }
                });
            }
        });


    }

    //post同步
    private void lpSpecific() {

        //獲取文字輸入的資訊進行非空判斷
        final String qq2 = mQq.getText().toString().trim();
        final String pwd2 = mPwd.getText().toString().trim();

        if(TextUtils.isEmpty(qq2) || TextUtils.isEmpty(pwd2)){
            Toast.makeText(this, "使用者名稱或密碼不能為空", Toast.LENGTH_SHORT).show();
            return;
        }

        new Thread(new Runnable() {
            @Override
            public void run() {
                //建立okhttpclient
                OkHttpClient client = new OkHttpClient.Builder()
                        .readTimeout(10,TimeUnit.SECONDS)
                        .connectTimeout(10,TimeUnit.SECONDS)
                        .build();

                FormBody formBody = new FormBody.Builder()
                        .add("qq", qq2)
                        .add("pwd", pwd2)
                        .build();

                Request request = new Request.Builder()
                        .post(formBody)
                        .url(strUrl)
                        .build();
                try {
                    Response response = client.newCall(request).execute();

                    //注意string和tostring的區別
                    final String string = response.body().string();

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                mResultText.setText(string);
                            }
                        });


                } catch (IOException e) {
                    e.printStackTrace();
                }


            }
        }).start();
    }


    //post非同步
    private void specific() {

        //獲取文字輸入的資訊進行非空判斷
        String qq = mQq.getText().toString().trim();
        String pwd = mPwd.getText().toString().trim();

        if(TextUtils.isEmpty(qq) || TextUtils.isEmpty(pwd)){
            Toast.makeText(this, "使用者名稱或密碼不能為空", Toast.LENGTH_SHORT).show();
            return;
        }

        //建立okhttpClient
        OkHttpClient client = new OkHttpClient.Builder()
                //讀取超時
                .readTimeout(10,TimeUnit.SECONDS)
                //連線超時
                .connectTimeout(10,TimeUnit.SECONDS)
                //寫入超時
                .writeTimeout(10,TimeUnit.SECONDS)
                .build();
        //建立表單
        mFormBody = new FormBody.Builder()
                .add("qq", qq)
                .add("pwd", pwd)
                .build();

        //建立request
        Request request = new Request.Builder()
                //請求方法(也是比get多的一個方法)
                .post(mFormBody)
                .url(strUrl)
                .build();

        //建立call物件
        Call call = client.newCall(request);

        //非同步的介面
        call.enqueue(new Callback() {
            @Override//失敗
            public void onFailure(Call call, IOException e) {
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(MainActivity.this, "請求錯誤", Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @Override//成功
            public void onResponse(Call call, Response response) throws IOException {
                final String string = response.body().string();
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        mResultText.setText(string);
                    }
                });
            }
        });
    }
}