AsyncHttpClient LoopJ 并保留来自 onSuccess 方法的数据
AsyncHttpClient LoopJ and preserving data from onSuccess method
我有一个名为 "invokeWS" 的方法。我想要做的就是用从 JSON 文件获取数据的列表数据 ArrayList 更新我在我的应用程序中使用的 ArrayAdapter 适配器 2。我尝试了不同的东西。
- onSuccess 无效,所以我不能return 对主程序做任何事情。我很高兴进入 try,JSON 被解析,我可以在控制台中看到我想要的字符串,但是一旦我退出 onSuccess,我就会得到一个空的 Arraylist。因此,当 returning 列表数据为空时。
- 还必须声明 listdata "final",否则 listdata 在 OnSuccess
上的任何地方都会出现 "accessed from inner class" 的错误
- 还尝试使 ArrayAdapter adapter2 在 onSuccess 内更新,但没有成功,因为据说它超出了范围。
我本来打算实现 onFinish 方法,但由于奇怪的原因,它甚至在 JSON 被解析之前就被调用了。
public static ArrayList<String> invokeWS() {
AsyncHttpClient client = new AsyncHttpClient();
final ArrayList<String> listdata = new ArrayList<String>();
client.get("http://xxx.xxx.xxx.xxx:8085/CompanyJersWS/company/showcompany", new JsonHttpResponseHandler() { //address to be specified each time, using external IP address
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
System.out.println("Inside Success invokeWS");
try {
JSONArray json = response.getJSONArray("Companies");
System.out.println("JSON is parsed!" +json.toString() + "Length is " + json.length());
System.out.println("First value is " + json.getString(0));
int i;
for (i=0;i<json.length();i++)
listdata.add(json.getString(i));
System.out.println("Listdata contains" +listdata);
} catch (Exception e) {
System.out.println("FAILED invokeWS");
e.printStackTrace();
}
}
}
);
System.out.println("Listdata out of scope contains" +listdata);
return listdata;
}
这就是我尝试从主 class;
调用 invokeWS() 的方式
ArrayList<String> tempval = invokeWS();
这是在 main class 中编写的适配器 2,我想将 json 文件中的列表数据作为内容。
ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, tempval.toArray(new String[tempval.size()]));
sp1.setAdapter(adapter2);
感谢阅读!
你可以做的是,在 onSuccess 之后传递你创建的 "listdata" 作为函数的参数(例如 "refreshData"):
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
System.out.println("Inside Success invokeWS");
try {
JSONArray json = response.getJSONArray("Companies");
System.out.println("JSON is parsed!" +json.toString() + "Length is " + json.length());
System.out.println("First value is " + json.getString(0));
int i;
for (i=0;i<json.length();i++){
listdata.add(json.getString(i));
}
System.out.println("Listdata contains" +listdata);
refreshData(listdata);
} catch (Exception e) {
System.out.println("FAILED invokeWS");
e.printStackTrace();
}
}
然后使用该函数用新列表更新数组:
public void refreshData(ArrayList<String> listdata){
ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, listdata);
sp1.setAdapter(adapter2);
}
我有一个名为 "invokeWS" 的方法。我想要做的就是用从 JSON 文件获取数据的列表数据 ArrayList 更新我在我的应用程序中使用的 ArrayAdapter 适配器 2。我尝试了不同的东西。
- onSuccess 无效,所以我不能return 对主程序做任何事情。我很高兴进入 try,JSON 被解析,我可以在控制台中看到我想要的字符串,但是一旦我退出 onSuccess,我就会得到一个空的 Arraylist。因此,当 returning 列表数据为空时。
- 还必须声明 listdata "final",否则 listdata 在 OnSuccess 上的任何地方都会出现 "accessed from inner class" 的错误
- 还尝试使 ArrayAdapter adapter2 在 onSuccess 内更新,但没有成功,因为据说它超出了范围。
我本来打算实现 onFinish 方法,但由于奇怪的原因,它甚至在 JSON 被解析之前就被调用了。
public static ArrayList<String> invokeWS() { AsyncHttpClient client = new AsyncHttpClient(); final ArrayList<String> listdata = new ArrayList<String>(); client.get("http://xxx.xxx.xxx.xxx:8085/CompanyJersWS/company/showcompany", new JsonHttpResponseHandler() { //address to be specified each time, using external IP address @Override public void onSuccess(int statusCode, Header[] headers, JSONObject response) { System.out.println("Inside Success invokeWS"); try { JSONArray json = response.getJSONArray("Companies"); System.out.println("JSON is parsed!" +json.toString() + "Length is " + json.length()); System.out.println("First value is " + json.getString(0)); int i; for (i=0;i<json.length();i++) listdata.add(json.getString(i)); System.out.println("Listdata contains" +listdata); } catch (Exception e) { System.out.println("FAILED invokeWS"); e.printStackTrace(); } } } ); System.out.println("Listdata out of scope contains" +listdata); return listdata; }
这就是我尝试从主 class;
调用 invokeWS() 的方式ArrayList<String> tempval = invokeWS();
这是在 main class 中编写的适配器 2,我想将 json 文件中的列表数据作为内容。
ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item, tempval.toArray(new String[tempval.size()])); sp1.setAdapter(adapter2);
感谢阅读!
你可以做的是,在 onSuccess 之后传递你创建的 "listdata" 作为函数的参数(例如 "refreshData"):
@Override
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
System.out.println("Inside Success invokeWS");
try {
JSONArray json = response.getJSONArray("Companies");
System.out.println("JSON is parsed!" +json.toString() + "Length is " + json.length());
System.out.println("First value is " + json.getString(0));
int i;
for (i=0;i<json.length();i++){
listdata.add(json.getString(i));
}
System.out.println("Listdata contains" +listdata);
refreshData(listdata);
} catch (Exception e) {
System.out.println("FAILED invokeWS");
e.printStackTrace();
}
}
然后使用该函数用新列表更新数组:
public void refreshData(ArrayList<String> listdata){
ArrayAdapter<String> adapter2 = new ArrayAdapter<String>(this,
android.R.layout.simple_spinner_item, listdata);
sp1.setAdapter(adapter2);
}