Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/220.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.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
JSON对象空Android异步任务_Android_Json_Rest - Fatal编程技术网

JSON对象空Android异步任务

JSON对象空Android异步任务,android,json,rest,Android,Json,Rest,我想使用一个rest服务,下载json并将其放入一个对象中,然后返回它,但该对象总是返回null,这是类: public class JSONParser { static InputStream is = null; static JSONObject jObj = null; static String json = ""; Context ctx; // constructor public JSONParser(Context ctx) { this.ctx = ctx;

我想使用一个rest服务,下载json并将其放入一个对象中,然后返回它,但该对象总是返回null,这是类:

public class JSONParser {

static InputStream is = null;
static JSONObject jObj = null;
static String json = "";
Context ctx;

// constructor
public JSONParser(Context ctx) {

    this.ctx = ctx;

}

public JSONObject getJSONFromUrl(String url) {

    AsyncjSONTask task = new AsyncjSONTask();

    task.execute(url);

    return jObj;

}

private class AsyncjSONTask extends AsyncTask<String, Void, JSONObject>{



    @Override
    protected JSONObject doInBackground(String... params) {

        String url = params[0];
        InputStream is = null;
        // Making HTTP request
                try {
                    // defaultHttpClient
                    DefaultHttpClient httpClient = new DefaultHttpClient();
                    HttpPost httpPost = new HttpPost(url);

                    HttpResponse httpResponse = httpClient.execute(httpPost);
                    HttpEntity httpEntity = httpResponse.getEntity();
                    is = httpEntity.getContent();           

                } catch (UnsupportedEncodingException e) {
                    e.printStackTrace();
                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                JSONObject jObjOut = null;
                try {
                    BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
                    StringBuilder sb = new StringBuilder();
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                    is.close();
                    json = sb.toString();
                } catch (Exception e) {
                    Log.e("Buffer Error", "Error converting result " + e.toString());
                }

                // try parse the string to a JSON object
                try {
                    jObjOut = new JSONObject(json);

                } catch (JSONException e) {
                    Log.e("JSON Parser", "Error parsing data " + e.toString());
                }
        return jObjOut;
    }

    @Override
    protected void onPostExecute(JSONObject jObjIn) {

        jObj = jObjIn;
    }

}

}
公共类JSONParser{
静态InputStream为空;
静态JSONObject jObj=null;
静态字符串json=“”;
上下文ctx;
//建造师
公共JSONParser(上下文ctx){
this.ctx=ctx;
}
公共JSONObject getJSONFromUrl(字符串url){
AsyncjSONTask任务=新建AsyncjSONTask();
task.execute(url);
返回jObj;
}
私有类AsyncjSONTask扩展了AsyncTask{
@凌驾
受保护的JSONObject doInBackground(字符串…参数){
字符串url=params[0];
InputStream=null;
//发出HTTP请求
试一试{
//defaultHttpClient
DefaultHttpClient httpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(url);
HttpResponse HttpResponse=httpClient.execute(httpPost);
HttpEntity HttpEntity=httpResponse.getEntity();
is=httpEntity.getContent();
}捕获(不支持的编码异常e){
e、 printStackTrace();
}捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
JSONObject jObjOut=null;
试一试{
BufferedReader reader=新的BufferedReader(新的InputStreamReader(is,“iso-8859-1”),8;
StringBuilder sb=新的StringBuilder();
字符串行=null;
而((line=reader.readLine())!=null){
sb.追加(第+行“\n”);
}
is.close();
json=sb.toString();
}捕获(例外e){
Log.e(“缓冲区错误”,“错误转换结果”+e.toString());
}
//尝试将字符串解析为JSON对象
试一试{
jObjOut=新的JSONObject(json);
}捕获(JSONException e){
Log.e(“JSON解析器”,“错误解析数据”+e.toString());
}
返回jObjOut;
}
@凌驾
受保护的void onPostExecute(JSONObject jObjIn){
jObj=jObjIn;
}
}
}
如果有其他方式使用rest服务,请告诉我

  • 请确保您要执行HTTP POST而不是GET
  • 在读取响应之前,最好检查HTTP响应状态
  • 不要将异步代码包装在非异步类中?您似乎感到困惑,并将其称为非异步
  • JSONParser类假设AsyncTask不是异步的,而实际上是异步的。下面是一个示例,说明您将如何执行您正在尝试执行的操作:

    public class MainActivity extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            new AsyncJsonTask(this).execute();
    
        }
    
        public void doSomethingWithTheResult(JsonObject result) {
            // Show the result on the View or do whatever with it.
        }
    
        private class AsyncJsonTask extends AsyncTask<String, Void, JsonObject> {
    
            private MainActivity _activity;
    
            public AsyncJsonTask(MainActivity activity) {
                this._activity = activity;
            }
    
            @Override
            protected JsonObject doInBackground(String... params) {
                JsonObject outputObject = null;
    
                // Call your web service to return the output 
                // ...
    
                return outputObject
            }
    
            @Override
            protected void onPostExecute(JsonObject result) {
                _activity.doSomethingWithTheResult(result);
            }
    
        }
    }
    
    公共类MainActivity扩展活动{
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    新建AsyncJsonTask(this.execute();
    }
    公共无效DoSomething及其结果(JsonObject结果){
    //在视图上显示结果或对其执行任何操作。
    }
    私有类AsyncJsonTask扩展了AsyncTask{
    私人活动(main activity);;
    公共AsyncJsonTask(主活动){
    这个。_活动=活动;
    }
    @凌驾
    受保护的JsonObject doInBackground(字符串…参数){
    JsonObject outputObject=null;
    //调用web服务以返回输出
    // ...
    返回输出对象
    }
    @凌驾
    受保护的void onPostExecute(JsonObject结果){
    _活动、剂量和结果(结果);
    }
    }
    }
    
  • 请确保您要执行HTTP POST而不是GET
  • 在读取响应之前,最好检查HTTP响应状态
  • 不要将异步代码包装在非异步类中?您似乎感到困惑,并将其称为非异步
  • JSONParser类假设AsyncTask不是异步的,而实际上是异步的。下面是一个示例,说明您将如何执行您正在尝试执行的操作:

    public class MainActivity extends Activity {
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            new AsyncJsonTask(this).execute();
    
        }
    
        public void doSomethingWithTheResult(JsonObject result) {
            // Show the result on the View or do whatever with it.
        }
    
        private class AsyncJsonTask extends AsyncTask<String, Void, JsonObject> {
    
            private MainActivity _activity;
    
            public AsyncJsonTask(MainActivity activity) {
                this._activity = activity;
            }
    
            @Override
            protected JsonObject doInBackground(String... params) {
                JsonObject outputObject = null;
    
                // Call your web service to return the output 
                // ...
    
                return outputObject
            }
    
            @Override
            protected void onPostExecute(JsonObject result) {
                _activity.doSomethingWithTheResult(result);
            }
    
        }
    }
    
    公共类MainActivity扩展活动{
    @凌驾
    创建时的公共void(Bundle savedInstanceState){
    新建AsyncJsonTask(this.execute();
    }
    公共无效DoSomething及其结果(JsonObject结果){
    //在视图上显示结果或对其执行任何操作。
    }
    私有类AsyncJsonTask扩展了AsyncTask{
    私人活动(main activity);;
    公共AsyncJsonTask(主活动){
    这个。_活动=活动;
    }
    @凌驾
    受保护的JsonObject doInBackground(字符串…参数){
    JsonObject outputObject=null;
    //调用web服务以返回输出
    // ...
    返回输出对象
    }
    @凌驾
    受保护的void onPostExecute(JsonObject结果){
    _活动、剂量和结果(结果);
    }
    }
    }
    
    日志中是否有错误?为什么不进行调试并找出它为空的原因?另外,您似乎正在执行Http POST,您确定您想要的是Http POST而不是GET吗?日志中是否有任何错误?为什么不调试它并找出它为Null的原因?另外,您似乎正在执行Http POST,您确定您想要的是Http POST而不是GET吗?好的,问题在于GET,现在我可以调试并探索响应,但是,我仍然得到null:S edit:i看到调试在doinbackgraund之前返回了对象。。。“我怎样才能解决这个问题?”埃德加。你的代码搞乱了。在调用Async方法之后,直接返回obj。您应该在onPostExecute()方法中进行后期处理。@Edgar请参阅我的更新版本