Android--menu和OkHttp框架(未封裝),結合Executors(執行緒池)實現網路請求的案例
阿新 • • 發佈:2019-02-05
涉及到的 知識點:
1.安卓UI元件menu
2.OkHttp框架
3.Executors(執行緒池)
OkHttp結構簡介
案例程式碼
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.Headers;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity-xx";
//服務端指定型別
private static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
private static final String POST_URL = "https://api.github.com/markdown/raw";
public static final String GET_URL = "http://www.imooc.com/api/teacher?type=2";
public final OkHttpClient mClient = new OkHttpClient();
private TextView mContentTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContentTextView = (TextView) findViewById(R.id.tvContent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//獲取menu泵,載入menu資源
getMenuInflater().inflate(R.menu.actions, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.menuGet:
getToSync();
break;
case R.id.menuResponse:
getToAsync();
break;
case R.id.menuPost:
post();
break;
}
return super.onOptionsItemSelected(item);
}
private void post() {
Request.Builder builder = new Request.Builder();
builder.url(POST_URL);
//***************************服務端設定的資料型別****************提交的資料***************************
builder.post(RequestBody.create(MEDIA_TYPE_MARKDOWN, "Hello world github/linguist#1 **cool**, and #1!"));
Request request = builder.build();
Call call = mClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
final String content = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
mContentTextView.setText(content);
}
});
}
}
});
}
private void getToSync() {
ExecutorService executor = Executors.newSingleThreadExecutor();
executor.submit(new Runnable() {
@Override
public void run() {
Request.Builder builder = new Request.Builder();
builder.url(GET_URL);
Request request = builder.build();
Log.d(TAG, "run: " + request);
Call call = mClient.newCall(request);
try {
//同步請求
Response response = call.execute();
if (response.isSuccessful()) {
final String string = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
mContentTextView.setText(string);
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
executor.shutdown();
}
private void getToAsync() {
Request.Builder bulider = new Request.Builder();
bulider.url(GET_URL);
Request request = bulider.build();
Call call = mClient.newCall(request);
//非同步請求
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
int code = response.code();
Headers headers = response.headers();
String content = response.body().string();
final StringBuilder sb = new StringBuilder();
sb.append("code: " + code).append("\nheaders: " + headers).append("\ncontent: " + content);
runOnUiThread(new Runnable() {
@Override
public void run() {
mContentTextView.setText(sb.toString());
Log.d(TAG, "run() called with: " + "" + sb);
}
});
}
});
}
}