Java 在更新字段之前等待JSON响应完成

Java 在更新字段之前等待JSON响应完成,java,android,json,Java,Android,Json,目前在我的应用程序中,我执行一个JSONDownloader,然后告诉我的应用程序等待一段时间,然后用检索到的数据更新字段。在更新字段之前,如何让应用程序等待JSONDownloader完成其任务 JSONDowloader类编写(节略)如下,并作为异步活动运行。这个类在需要时被调用,并设置全局变量,这些变量在被调用一段时间后会被更新。我希望在类完成运行后立即更新字段 public class JSONDownloader extends AsyncTask<Object, Object,

目前在我的应用程序中,我执行一个JSONDownloader,然后告诉我的应用程序等待一段时间,然后用检索到的数据更新字段。在更新字段之前,如何让应用程序等待JSONDownloader完成其任务

JSONDowloader类编写(节略)如下,并作为异步活动运行。这个类在需要时被调用,并设置全局变量,这些变量在被调用一段时间后会被更新。我希望在类完成运行后立即更新字段

public class JSONDownloader extends AsyncTask<Object, Object, Object>{

    @Override
    protected Object doInBackground(Object... params) {
        if(JSONstate == false){
            try {
                final URL url = new URL("https://irrelevant");

                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());
                }
                System.out.println("up to setting string");
                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("accessPointName");
                    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);      
            }
        }
        return null;
    }
    protected void onPostExecute(Void result){
    }
}
公共类JSONDownloader扩展了异步任务{
@凌驾
受保护对象doInBackground(对象…参数){
if(JSONstate==false){
试一试{
最终URL=新URL(“https://irrelevant");
最终URLConnection URLConnection=url.openConnection();
setRequestProperty(“内容类型”,“应用程序/json;字符集=utf-8”);
urlConnection.connect();
final InputStream InputStream=urlConnection.getInputStream();
最终StringBuilder sb=新StringBuilder();
while(inputStream.available()>0){
sb.append((char)inputStream.read());
}
System.out.println(“直到设置字符串”);
字符串结果=sb.toString();
JSONObject jsonOrg=新的JSONObject(结果);
字符串ok=“ok”;
Response=jsonOrg.getString(“Response”);
System.out.println(响应);
如果(响应等于(确定)){
设置响应=真;
orgName=jsonOrg.getString(“orgName”);
System.out.println(“orgName”+orgName);
accessPointName=jsonOrg.getString(“accessPointName”);
System.out.println(“accessPointName”+accessPointName);
lat=jsonOrg.getString(“纬度”);
系统输出打印项次(“lat”+lat);
longi=jsonOrg.getString(“经度”);
System.out.println(“longi”+longi);
floor=jsonOrg.getString(“floor”);
系统输出打印项次(“楼层”+楼层);
orgId=jsonOrg.getString(“orgId”);
System.out.println(“orgId”+orgId);
}
否则{
System.out.println(“发送的数据错误”);
设置响应=错误;
}
}捕获(例外e){
系统错误打印(e);
}
}
返回null;
}
受保护的void onPostExecute(void结果){
}
}
JSONDownloader在需要的任何方法中调用,然后在调用之后立即调用;当前,在更新字段之前使用设置的时间,如下所示:

public void waitthencall()
{
    long t0,t1;
    t0=System.currentTimeMillis();
    do{
        t1=System.currentTimeMillis();
    }
    while (t1-t0<2000);

    setfields();
}
public void waitthencall()
{
长t0,t1;
t0=System.currentTimeMillis();
做{
t1=System.currentTimeMillis();
}

而(t1-t0使用异步任务


可能会有帮助!

使用异步任务


可能会有帮助!

您需要一个回调侦听器来更新您的UI


创建一个回调侦听器,并在活动中或从更新UI的位置实现它。

您需要一个回调侦听器来更新UI


创建一个回调监听器,并在您的活动中或从您正在更新UI的位置实现它。

Dude,一旦doInBackGround完成处理,就调用onPostExecute方法从那里调用您的方法,它将确保doInBackGround已完成其执行。

Dude,一旦doInBac完成,就调用onPostExecute方法kGround已经完成了处理并从那里调用了您的方法,它将向您保证doInBackGround已经完成了它的执行

首先是JSONDownloader,从类的名称可以明显看出,但这不是一个库,我假定它是我们需要查看的自定义构建类。其次,我假定您将JSONDownloader任务作为AsyncTask而不是AsyncTask执行在UI线程上,您可以检查线程是否已完成,并在完成所有操作后执行操作。显示更多代码,以便我们提供帮助。编辑made:JSONDownloader类。在` protected void onPostExecute(void result){}中执行其余操作`。这不起作用。如果从这里调用,则不会运行该方法。首先,什么是JSONDownloader,从类的名称可以明显看出,但这不是一个库,我假定它是我们需要查看的自定义构建类。其次,我假定您将JSONDownloader任务作为AsyncTask执行,而不是在UI线程上执行,以便您可以检查线程是否已完成并完成完成所有操作后执行操作。显示更多代码以便我们提供帮助。编辑made:JSONDownloader类显示。在` protected void onPostExecute(void result){}中执行其余操作`。这不起作用。如果从此处调用该方法,则不会运行该方法。该代码已作为异步活动运行。问题是找到一种仅在JSONDownloader完成运行后运行后续代码的方法。该代码已作为异步活动运行。问题是找到一种仅在JSONDownloader完成运行后运行后续代码的方法SONDownloader已经运行完毕。谢谢,我会调查的。谢谢,我会调查的。