public class MainActivity extends AppCompatActivity {
private static final String POST_URL = "https://api.github.com/markdown/raw";
private static final MediaType MEDIA_TYPE_MARKDOWN
= MediaType.parse("text/x-markdown; charset=utf-8");
public static final String TARGET_URL = "https://raw.githubusercontent.com/square/okhttp/master/README.md";
OkHttpClient mokHttpClient = new OkHttpClient();
TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.tv_content);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.action, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.menuGet:
get();
break;
case R.id.menuResponse:
response();
break;
case R.id.menuPost:
post();
break;
}
return super.onOptionsItemSelected(item);
}
private void post() {
MediaType mediaType = MediaType.parse(
"text/x-markdown; charset=utf-8");
RequestBody stringBody = RequestBody.create(
"Hello world github/linguist#1 **cool**, and #1!"
, mediaType);
Request request = new Request
.Builder()
.url(POST_URL)
.post(stringBody)
.build();
// 方法已经过时
// builder.post(RequestBody.create(MEDIA_TYPE_MARKDOWN
// , "Hello world github/linguist#1 **cool**, and #1!"));
// Request request = builder.build();
Call call = mokHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
if (response.isSuccessful()) {
final String content = response.body().string();
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(content);
}
});
}
}
});
}
private void response() {
Request.Builder builder = new Request.Builder();
builder.url(TARGET_URL);
Request request = builder.build();
Call call = mokHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
int code = response.code();//获得响应码
Headers headers = response.headers();//相当于MAP,有key和Value
String content = response.body().string();//获得响应体,再把响应体转为字符串
final StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("code:" + code);
stringBuilder.append("\nheaders:" + headers.toString());
stringBuilder.append("\ncontent:" + content);
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(stringBuilder);
}
});
}
});
}
private void get() {
ExecutorService executor = Executors.newSingleThreadExecutor();//开一个线程池
executor.submit(new Runnable() {
@Override
public void run() {
Request.Builder builder = new Request.Builder();
builder.url(TARGET_URL);
Request request = builder.build();
Call call = mokHttpClient.newCall(request);
try {
//这是同步方法
//程序调用到这里会阻塞
Response response = call.execute();
//从response里面拿数据
if (response.isSuccessful()) {
final String content = response.body().string();
//到UI线程去更新
runOnUiThread(new Runnable() {
@Override
public void run() {
textView.setText(content);
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
});
executor.shutdown();//线程池关掉
}
}
layout
<?xml version="1.0" encoding="utf-8"?>
<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">
<ScrollView
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</ScrollView>
</LinearLayout>
xml
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:id="@+id/menuGet"
android:title="Get" />
<item
android:id="@+id/menuResponse"
android:title="Response" />
<item
android:id="@+id/menuPost"
android:title="Post" />
</menu>