Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 从AsyncTask返回JSON字符串_Android_Json_Android Asynctask - Fatal编程技术网

Android 从AsyncTask返回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

通常,我会为每个使用AsyncTask扩展的web服务调用创建类,而且维护代码非常困难。因此,我想创建一个类,并根据参数获取输出Json字符串。 如何返回JSON字符串

更新

这是我试过的

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(){}
  }