okHttp的基本使用及2種請求方式和各方法的同步非同步實現
阿新 • • 發佈:2018-11-19
一、效果
二、佈局
<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); } }); } }); } }