1

現在、アプリケーションで 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 は、必要なメソッド内で呼び出され、これが呼び出された直後に呼び出されます。現在、次のように、フィールドを更新する前に設定された時間が使用されます。

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

    setfields();
}
4

3 に答える 3

1

UI を更新するには Callback リスナーが必要です。

コールバック リスナーを作成し、アクティビティ内または UI を更新する場所から実装します。

于 2013-08-03T12:28:00.383 に答える
0

おい、メソッドonPostExecuteは、doInBackGroundの処理が完了したら呼び出され、そこからメソッドを呼び出すと、doInBackGroundが実行を終了したことが保証されます

于 2013-08-03T12:29:02.307 に答える