我正在使用异步任务来运行JSON下载器:(删节)
public class JSONDownloader extends AsyncTask<Object, Object, Object>{
@Override
protected Object doInBackground(Object... params) {
if(JSONstate == false){
try {
final URL url = new URL([REDACTED]);
final URLConnection urlConnection = url.openConnection();
urlConnection.setRequestProperty("Content-Type", "application/json; charset=utf-8");
urlConnection.connect();
final InputStream inputStream = urlConnection.getInputStream();
final StringBuilder sb = new StringBuilder();
while (inputStream.available() > 0) {
sb.append((char) inputStream.read());
}
String result = sb.toString();
JSONObject jsonOrg = new JSONObject(result);
String ok = "ok";
Response = jsonOrg.getString("response");
System.out.println(Response);
if(Response.equals(ok)){
Settingsresponse = true;
orgName = jsonOrg.getString("orgName");
System.out.println("orgName" + orgName);
accessPointName = jsonOrg.getString("attendanceRecorderName");
System.out.println("accessPointName" + accessPointName);
lat = jsonOrg.getString("latitude");
System.out.println("lat" + lat);
longi = jsonOrg.getString("longitude");
System.out.println("longi" + longi);
floor = jsonOrg.getString("floor");
System.out.println("floor" + floor);
orgId = jsonOrg.getString("orgId");
System.out.println("orgId" + orgId);
}
else{
System.out.println("Data sent was erroneous");
Settingsresponse = false;
}
} catch (Exception e) {
System.err.print(e);
}
}
else if(JSONstate == true){
try {
[redacted]
}
else{
System.out.println("Data sent was erroneous");
Settingsresponse = false;
}
} catch (Exception e) {
System.err.print(e);
}
}
return null;
}
protected void onPostExecute(Void result){
if(JSONstate == false){
System.out.println("This piece of code is definitely being run");
setfields();
}
else if(JSONstate == true){
settestfields();
//This method does not run upon the completion of the JSON request, as it supposedly should
}
}
}
完成JSONRequest后,'onPostExecute'方法不会运行。我一直在尝试使用此方法,以便在请求完成后立即更新一组字段,而不必设置明确的等待时间。我只是简单地利用代码错了吗?还是有什么我错过的?
答案 0 :(得分:6)
您没有覆盖onPostExecute的正确方法。
你有:
protected void onPostExecute(Void result)
你需要:
protected void onPostExecute(Object result)
请注意,您提供的第三个通用参数的类型为Object
。这是onPostExecute
用作参数的类型。因此,onPostExecute
的方法签名需要接受Object
,而不是Void
。
你应该在这里使用boolean的结果类型而不是object,并删除Json状态类变量。这使您的AsyncTask更加灵活,并且可以允许您在执行后向用户显示操作完成的一些指示。
答案 1 :(得分:0)
我不得不说你在AsyncTask中的代码与点无关。
AsyncTask被设计为从UI线程运行的另一个线程。所以你应该将它用作运行UI线程的内部类,然后onPostExecute()部分可以做一些事情来显示结果,或者你作为你的代码,如果你把它作为一个独立的类。您应该设计一个接口,其他类,如活动或片段,运行新的AsyncTask.execute()应该实现该接口。
另外,java不是javascript。 doInBackground()中的变量仅限于函数中。所以你在onPostExecute()中所做的一切都没有。
你应该使用
JSONObject jsonOrg
作为一个类变量,或者你应该在doInBackground()的末尾返回它并在onPostExecute()中获取它
毕竟,我建议你看一下api文档的例子。虽然它有点复杂,但它表明一切都很完美。
答案 2 :(得分:-1)
尝试使用覆盖方法
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
Log.i("in on ", "entered");
hideProgress();
}
根据william的建议,类型应该与覆盖方法匹配。我编辑了下面的答案
public class JSONDownloader extends AsyncTask<Object, Object, Object>
@Override
protected void onPostExecute(Object result) {
super.onPostExecute(result);
}