Android 从AsyncTask返回JSON字符串
通常,我会为每个使用AsyncTask扩展的web服务调用创建类,而且维护代码非常困难。因此,我想创建一个类,并根据参数获取输出Json字符串。 如何返回JSON字符串 更新 这是我试过的Android 从AsyncTask返回JSON字符串,android,json,android-asynctask,Android,Json,Android Asynctask,通常,我会为每个使用AsyncTask扩展的web服务调用创建类,而且维护代码非常困难。因此,我想创建一个类,并根据参数获取输出Json字符串。 如何返回JSON字符串 更新 这是我试过的 public class WebCallController extends AsyncTask<Void,Void,String> { String PassPeram = ""; JSONStringer JSonRequestString; String URL; String JSonR
public class WebCallController extends AsyncTask<Void,Void,String>
{
String PassPeram = "";
JSONStringer JSonRequestString;
String URL;
String JSonResponseString;
public WebCallController(String PerameterPass, JSONStringer JSonRequestString, String URL) {
PassPeram = PerameterPass;
this.JSonRequestString = JSonRequestString;
this.URL = URL;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(Void... params) {
HttpClient client = new DefaultHttpClient();
HttpPost post = new HttpPost(URL);
post.setHeader("Content-type", "application/json");
try {
StringEntity entity = new StringEntity(JSonRequestString.toString());
post.setEntity(entity);
}
catch (Exception Ex)
{
}
try {
HttpResponse response = client.execute(post);
StatusLine status = response.getStatusLine();
int statusCode = status.getStatusCode();
if(statusCode == 400)
{
Log.d("Error", "bad request");
}
else if(statusCode == 505)
{
Log.d("Error","Internal server error");
}
else
{
InputStream jsonStream = response.getEntity().getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(jsonStream));
StringBuilder builder = new StringBuilder();
String line;
while((line = reader.readLine()) != null)
{
builder.append(line);
}
JSonResponseString = builder.toString();
}
}
catch (IOException Ex)
{
}
return JSonResponseString;
}
@Override
protected void onPostExecute(String aVoid) {
super.onPostExecute(aVoid);
}
公共类WebCallController扩展异步任务
{
字符串PassPeram=“”;
JSONStringer JSonRequestString;
字符串URL;
字符串JSonResponseString;
公共WebCallController(字符串PerameterPass、JSONStringer、JSonRequestString、字符串URL){
PasseRam=PerameterPass;
this.JSonRequestString=JSonRequestString;
this.URL=URL;
}
@凌驾
受保护的void onPreExecute(){
super.onPreExecute();
}
@凌驾
受保护字符串doInBackground(无效…参数){
HttpClient=new DefaultHttpClient();
HttpPost=新的HttpPost(URL);
setHeader(“内容类型”、“应用程序/json”);
试一试{
StringEntity=newStringEntity(JSonRequestString.toString());
后设实体(实体);
}
捕获(例外情况除外)
{
}
试一试{
HttpResponse response=client.execute(post);
StatusLine status=response.getStatusLine();
int statusCode=status.getStatusCode();
如果(状态代码==400)
{
Log.d(“错误”、“错误请求”);
}
否则如果(状态代码==505)
{
Log.d(“错误”,“内部服务器错误”);
}
其他的
{
InputStream jsonStream=response.getEntity().getContent();
BufferedReader=new BufferedReader(new InputStreamReader(jsonStream));
StringBuilder=新的StringBuilder();
弦线;
而((line=reader.readLine())!=null)
{
builder.append(行);
}
JSonResponseString=builder.toString();
}
}
捕获(IOEX异常)
{
}
返回JSonResponseString;
}
@凌驾
受保护的void onPostExecute(字符串避免){
super.onPostExecute(避免);
}
}这可能就是您要查找的内容(获取字符串作为结果并将其解析为json):
私有类MyAsyncTask扩展了AsyncTask{
@凌驾
受保护的字符串doInBackground(字符串…参数){
返回“已执行”;
}
@凌驾
受保护的字符串onPostExecute(字符串结果){
返回“json字符串”;
}
@凌驾
受保护的void onPreExecute(){}
@凌驾
受保护的void onProgressUpdate(void…值){}
}
尝试下面的代码,并将其放在单独的类中,从中它将json字符串返回给您的活动
仅将url传递给此方法并以字符串格式获取响应
public static final String GetConnectionInputStream(String strUrl) {
String line = null;
String response = null;
try {
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is
// established.
// The default value is zero, that means the timeout is not used.
HttpConnectionParams.setConnectionTimeout(httpParameters, 30000);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
HttpConnectionParams.setSoTimeout(httpParameters, 30000);
// This is the default apacheconnection.
HttpClient mHttpClient = new DefaultHttpClient(httpParameters);
// Pathe of serverside
HttpGet mHttpGet = new HttpGet(strUrl);
// get the valu from the saerverside as response.
HttpResponse mHttpResponse = mHttpClient.execute(mHttpGet);
HttpEntity mHttpEntity = mHttpResponse.getEntity();
try {
// convert response in to the string.
if (mHttpEntity.getContent() != null) {
BufferedReader mBufferedReader = new BufferedReader(
new InputStreamReader(mHttpEntity.getContent(),
HTTP.UTF_8), 8);
StringBuilder mStringBuilder = new StringBuilder();
while ((line = mBufferedReader.readLine()) != null) {
mStringBuilder.append(line + "\n");
}
response = mStringBuilder.toString();
// mInputStream.close();
}
} catch (Exception e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
return response;
}
更改您的doInBackground
方法,如下所示:
private class GetParsedResponse extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
}
@Override
protected String doInBackground(Void... params) {
String response=null;
response=GetConnectionInputStream(URL);
return response;
}
@Override
protected void onPostExecute(String result) {
//your response parsing code.
}
}
私有类GetParsedResponse扩展异步任务{
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护字符串doInBackground(无效…参数){
字符串响应=null;
响应=GetConnectionInputStream(URL);
返回响应;
}
@凌驾
受保护的void onPostExecute(字符串结果){
//您的响应解析代码。
}
}
我假设您需要编写一个AsyncTask
,它可以用于每个webservice调用。您可以执行以下示例中的操作
步骤1:创建一个抽象类
public abstract class HttpHandler {
public abstract HttpUriRequest getHttpRequestMethod();
public abstract void onResponse(String result);
public void execute(){
new AsyncHttpTask(this).execute();
}
}
2。Sterp-2:编写你的AsyncTask
code
public class AsyncHttpTask extends AsyncTask<String, Void, String>{
private HttpHandler httpHandler;
public AsyncHttpTask(HttpHandler httpHandler){
this.httpHandler = httpHandler;
}
@Override
protected String doInBackground(String... arg0) {
//do your task and return the result
String result = "";
return result;
}
@Override
protected void onPostExecute(String result) {
httpHandler.onResponse(result); // set it to the onResponse()
}
}
public class MainActivity extends Activity implements OnClickListener {
private Button btnRequest;
private EditText etResponse;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnRequest = (Button) findViewById(R.id.btnRequest);
etResponse = (EditText) findViewById(R.id.etRespose);
//check isConnected()...code is on github
btnRequest.setOnClickListener(this);
}
@Override
public void onClick(View v) {
new HttpHandler() {
@Override
public HttpUriRequest getHttpRequestMethod() {
return new HttpGet("http://hmkcode.com/examples/index.php");
// return new HttpPost(url)
}
@Override
public void onResponse(String result) {
Toast.makeText(getBaseContext(), "Received!", Toast.LENGTH_LONG).show();
etResponse.setText(result);
}
}.execute();
}
// public boolean isConnected(){}
}
参考文献
你能展示你尝试过的吗?展示你如何实现它的代码。查看我的答案,它可能会对你有所帮助。我会尝试这个,但我在前面的答案中找到了答案。感谢您的帮助。在您的问题中,您要求提供一个通用方法,该方法从url读取json响应并以字符串形式返回。我不知道只有asynctask方法答案对您有用。这意味着您的问题问错了。我在doInBackground方法中尝试代码时犯了一个错误,我从您的答案中发现了错误。我将Void更改为String,然后它不会返回JSON字符串。然后我看到了前面的答案,并复制了它。它现在起作用了。我需要返回JSON字符串。我会尝试这个,但我在前面的答案中找到了答案。谢谢你的帮助欢迎。。。快乐编码:)
public class AsyncHttpTask extends AsyncTask<String, Void, String>{
private HttpHandler httpHandler;
public AsyncHttpTask(HttpHandler httpHandler){
this.httpHandler = httpHandler;
}
@Override
protected String doInBackground(String... arg0) {
//do your task and return the result
String result = "";
return result;
}
@Override
protected void onPostExecute(String result) {
httpHandler.onResponse(result); // set it to the onResponse()
}
}
public class MainActivity extends Activity implements OnClickListener {
private Button btnRequest;
private EditText etResponse;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnRequest = (Button) findViewById(R.id.btnRequest);
etResponse = (EditText) findViewById(R.id.etRespose);
//check isConnected()...code is on github
btnRequest.setOnClickListener(this);
}
@Override
public void onClick(View v) {
new HttpHandler() {
@Override
public HttpUriRequest getHttpRequestMethod() {
return new HttpGet("http://hmkcode.com/examples/index.php");
// return new HttpPost(url)
}
@Override
public void onResponse(String result) {
Toast.makeText(getBaseContext(), "Received!", Toast.LENGTH_LONG).show();
etResponse.setText(result);
}
}.execute();
}
// public boolean isConnected(){}
}