说明:
我正在为我的应用程序使用Web服务。其中,每个请求都是>使用GET方法。所以创建一个类,我在其中创建方法来设置> url并从服务器获取响应。
这是我的课程,它从服务器获得响应。
package adapter;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.UnknownHostException;
public class CallAPI {
private Context context;
public String GetResponseGetMethod(String url) {
URL obj;
String Response="";
String getMethodResponse = "";
try {
obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
Log.e("GET Response Code :: " , ""+responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) { // success
BufferedReader in = new BufferedReader(new InputStreamReader(
con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine+"\n");
}
in.close();
// print result
getMethodResponse=response.toString();
Log.e("Response",response.toString());
} else {
Log.e("GET request not worked","");
}
}
catch (MalformedURLException e) {
Toast.makeText(context, "YEs got it", Toast.LENGTH_LONG).show();
}
catch (IOException e){
Toast.makeText(context, "YEs Inside IO it", Toast.LENGTH_LONG).show();
}
return getMethodResponse;
}
}
上课得到回应。
以下是我使用 Asynktask
的课程public class TabJson extends AsyncTask<String, String, String> {
String jsonStr = "";
@Override
protected void onPreExecute() {
Utils.Pdialog(getContext());
}
@Override
protected String doInBackground(String... params) {
jsonStr = new CallAPI().GetResponseGetMethod(url);
if (jsonStr != null) {
try {
JSONObject obj = new JSONObject(jsonStr);
} catch (JSONException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
}
}
有时需要时间才能得到回应。
MyQuestion是:
如果需要花费太多时间来获得响应,我该如何处理这种情况呢。它还引发了像unknowhostapi这样的异常。
我如何克服这个问题。请帮我解决这个问题。
答案 0 :(得分:1)
public class CallAPI {
private Context context;
public String GetResponseGetMethod(String url) {
URL obj;
String Response="";
String getMethodResponse = "";
try {
obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
Log.e("GET Response Code :: " , ""+responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) { // success
BufferedReader in = new BufferedReader(new InputStreamReader(
con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine+"\n");
}
in.close();
// print result
getMethodResponse=response.toString();
Log.e("Response",response.toString());
} else {
Log.e("GET request not worked","");
}
}
catch (MalformedURLException e) {
getMethodResponse="Malformed";
Toast.makeText(context, "YEs got it", Toast.LENGTH_LONG).show();
}
catch (IOException e){
getMethodResponse="IO";
Toast.makeText(context, "YEs Inside IO it", Toast.LENGTH_LONG).show();
}
return getMethodResponse;
}
}
在TabJson类中,在doInBackground方法中返回以下内容 -
@Override
protected String doInBackground(String... params) {
jsonStr = new CallAPI().GetResponseGetMethod(url);
return jsonStr;
}
在TabJson类中,在onPostExecute方法中使用以下代码 -
@Override
protected void onPostExecute(String s) {
if (s != null) {
try {
JSONObject obj = new JSONObject(jsonStr);
} catch (JSONException e) {
e.printStackTrace();
//Show pop up or alert msg here.
}
}
switch(s){
case "IO":
//Do what you want to show your user.
break;
case "Malformed":
//Do what you want to show your user.
break;
}
super.onPostExecute(s);
}
答案 1 :(得分:0)
@Milan我在你的代码中没有看到任何AsyncTask。如果要实现AsyncTask任务,请按照以下步骤操作 -
1.extend AsyncTask
2.override doInBackground()和postExecute方法。
在doInBackground中完成工作并从服务器获取响应。
根据您的回复状态处理您的例外。
答案 2 :(得分:0)
您必须使处理服务器的函数返回一些可能包含所有可能结果的对象,而不仅仅是成功案例。例如:
class Results {
public String result;
public Err error;
public enum Err {
OK, ERR1, ERR2, ERR3
}
}
因此,如果一切正常,则将结果字符串设置为响应,并将错误枚举设置为OK。或者,如果存在其他错误,请使用您定义的另一个枚举。在接收结果的代码中,您可以检查错误类型以确定如何处理它。
答案 3 :(得分:0)
您的代码存在一些问题:
protected String doInBackground(String... params) {
jsonStr = new CallAPI().GetResponseGetMethod(url);
if (jsonStr != null) {
try {
JSONObject obj = new JSONObject(jsonStr);
} catch (JSONException e) {
e.printStackTrace();
}
}
return null;
}
您将返回null
。改为返回字符串。
protected String doInBackground(String... params) {
jsonStr = new CallAPI().GetResponseGetMethod(url);
return jsonStr;
}
现在,在post执行中,将其格式化为jsonObject,如下所示:
@Override
protected void onPostExecute(String s) {
if (s != null) {
try {
JSONObject obj = new JSONObject(s);
} catch (JSONException e) {
e.printStackTrace();
}
}
}
现在,你有JSONobject
obj。用它做点什么。
答案 4 :(得分:-1)
使用Async Task并在您的清单文件中添加互联网权限。
<uses-permission android:name="android.permission.INTERNET" />