Android 中的 HTTP POST 请求使用 Retrofit 2
HTTP POST request in Android using Retrofit 2
我正在尝试将字符串发送到服务器,但遇到了问题。
这是我的方法。
ppublic void intervalPost(View view) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://requestb.in/")
.addConverterFactory(GsonConverterFactory.create())
.build();
PostInterface service = retrofit.create(PostInterface.class);
Call<ResponseBody> call = service.postTime(time2);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Log.d("Postavke", "Reached onResponse");
if (!response.isSuccess()) {
Log.d("Postavke", "No Success");
}
}
@Override
public void onFailure(Call<ResponseBody> call,Throwable t) {
// Toast for the moment
// Appropriate error handling code should be present here
Toast.makeText(Postavke.this, "Failed !", Toast.LENGTH_LONG).show();
}
});
}
和接口:
public interface PostInterface {
@FormUrlEncoded
@POST("/1b2bqxl1")
Call<ResponseBody> postTime(@Field("interval") String time);
}
我正在从微调器中获取字符串 time2:
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String label = spinner.getSelectedItem().toString();
tokens = new StringTokenizer(label, " ");
time = tokens.nextToken().trim();
timeConvert = Integer.parseInt(time);
if (timeConvert == 1 || timeConvert == 2 || timeConvert == 3 || timeConvert == 6 || timeConvert == 12)
timeConvert = timeConvert * 60;
time2 = String.valueOf(timeConvert);
}
想法是当您在微调器中选择间隔时,单击按钮应将时间 2 发送到服务器。
当我 运行 应用程序时,我收到此错误:java.lang.IllegalStateException: Could not execute method for android:onClick
我的问题是如何修复这个错误,如果你可以检查 post 方法,我不确定它是否有效。
布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg"
android:orientation="vertical"
>
<TextView
android:text="@string/odaberi_interval"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/odabirintervala"
android:textSize="20sp"
android:layout_marginTop="30dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="20dp"
android:textColor="#148299"
/>
<Spinner
android:id="@+id/spinner"
android:layout_width="125dp"
android:layout_height="wrap_content"
android:layout_marginTop="33dp"
android:layout_toRightOf="@id/odabirintervala"
android:drawSelectorOnTop="true"
></Spinner>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Promijeni interval"
android:layout_below="@id/spinner"
android:layout_marginTop="20dp"
android:layout_centerHorizontal="true"
android:onClick="intervalPost"
android:id="@+id/intervalButton"
/>
</RelativeLayout>
你在主线程上做改造请求。尝试使用 AsyncTask or RxAndroid or Volley.
你也可以试试这个答案:Does Retrofit make network calls on main thread?
编辑。示例:
public void intervalPost(View view) {
try {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://requestb.in/")
.addConverterFactory(GsonConverterFactory.create())
.build();
PostInterface service = retrofit
.create(PostInterface.class);
.postTime(time2)
.enqueue(new Callback<Response>() {
@Override
public void onResponse(Call<Response> call, Response<Response> response) {
// code here
}
@Override
public void onFailure(Call<Response> call, Throwable t) {
// code here
}
});
} catch (IOException Ex) {
}
}
从错误中您得到消息“@Field 参数只能与表单编码一起使用。”
也就是说,你需要在你的界面上加上@FormUrlEncoded
@FormUrlEncoded
@POST("/1gics1o1")
Call<Response> postTime(@Field("interval") String time);
错误"Caused by: android.os.NetworkOnMainThreadException"表示您的网络进程在主线程中的时间太长,因为您没有使用异步方法。
尝试改变
call.execute();
使用入队方法
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Log.d("Postavke", "Reached onResponse");
if (!response.isSuccess()) {
Log.d("Postavke", "No Success");
}else{
Log.d("Postavke", "responsebody => "+ response.body().toString());
}
}
@Override
public void onFailure(Call<ResponseBody> call,Throwable t) {
// Toast for the moment
// Appropriate error handling code should be present here
Toast.makeText(Postavke.this, "Failed !", Toast.LENGTH_LONG).show();
}
});
我正在尝试将字符串发送到服务器,但遇到了问题。
这是我的方法。
ppublic void intervalPost(View view) {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://requestb.in/")
.addConverterFactory(GsonConverterFactory.create())
.build();
PostInterface service = retrofit.create(PostInterface.class);
Call<ResponseBody> call = service.postTime(time2);
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Log.d("Postavke", "Reached onResponse");
if (!response.isSuccess()) {
Log.d("Postavke", "No Success");
}
}
@Override
public void onFailure(Call<ResponseBody> call,Throwable t) {
// Toast for the moment
// Appropriate error handling code should be present here
Toast.makeText(Postavke.this, "Failed !", Toast.LENGTH_LONG).show();
}
});
}
和接口:
public interface PostInterface {
@FormUrlEncoded
@POST("/1b2bqxl1")
Call<ResponseBody> postTime(@Field("interval") String time);
}
我正在从微调器中获取字符串 time2:
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
String label = spinner.getSelectedItem().toString();
tokens = new StringTokenizer(label, " ");
time = tokens.nextToken().trim();
timeConvert = Integer.parseInt(time);
if (timeConvert == 1 || timeConvert == 2 || timeConvert == 3 || timeConvert == 6 || timeConvert == 12)
timeConvert = timeConvert * 60;
time2 = String.valueOf(timeConvert);
}
想法是当您在微调器中选择间隔时,单击按钮应将时间 2 发送到服务器。
当我 运行 应用程序时,我收到此错误:java.lang.IllegalStateException: Could not execute method for android:onClick
我的问题是如何修复这个错误,如果你可以检查 post 方法,我不确定它是否有效。
布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/bg"
android:orientation="vertical"
>
<TextView
android:text="@string/odaberi_interval"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/odabirintervala"
android:textSize="20sp"
android:layout_marginTop="30dp"
android:layout_marginLeft="30dp"
android:layout_marginRight="20dp"
android:textColor="#148299"
/>
<Spinner
android:id="@+id/spinner"
android:layout_width="125dp"
android:layout_height="wrap_content"
android:layout_marginTop="33dp"
android:layout_toRightOf="@id/odabirintervala"
android:drawSelectorOnTop="true"
></Spinner>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Promijeni interval"
android:layout_below="@id/spinner"
android:layout_marginTop="20dp"
android:layout_centerHorizontal="true"
android:onClick="intervalPost"
android:id="@+id/intervalButton"
/>
</RelativeLayout>
你在主线程上做改造请求。尝试使用 AsyncTask or RxAndroid or Volley.
你也可以试试这个答案:Does Retrofit make network calls on main thread?
编辑。示例:
public void intervalPost(View view) {
try {
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://requestb.in/")
.addConverterFactory(GsonConverterFactory.create())
.build();
PostInterface service = retrofit
.create(PostInterface.class);
.postTime(time2)
.enqueue(new Callback<Response>() {
@Override
public void onResponse(Call<Response> call, Response<Response> response) {
// code here
}
@Override
public void onFailure(Call<Response> call, Throwable t) {
// code here
}
});
} catch (IOException Ex) {
}
}
从错误中您得到消息“@Field 参数只能与表单编码一起使用。”
也就是说,你需要在你的界面上加上@FormUrlEncoded
@FormUrlEncoded
@POST("/1gics1o1")
Call<Response> postTime(@Field("interval") String time);
错误"Caused by: android.os.NetworkOnMainThreadException"表示您的网络进程在主线程中的时间太长,因为您没有使用异步方法。 尝试改变
call.execute();
使用入队方法
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Log.d("Postavke", "Reached onResponse");
if (!response.isSuccess()) {
Log.d("Postavke", "No Success");
}else{
Log.d("Postavke", "responsebody => "+ response.body().toString());
}
}
@Override
public void onFailure(Call<ResponseBody> call,Throwable t) {
// Toast for the moment
// Appropriate error handling code should be present here
Toast.makeText(Postavke.this, "Failed !", Toast.LENGTH_LONG).show();
}
});