0

次のように、非同期タスクを使用して 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」メソッドは実行されません。明確な待機時間を設定する代わりに、リクエストが完了するとすぐに一連のフィールドを更新できるように、このメソッドを使用しようとしています。私は単にコードを間違って利用していますか? それとも、私が見逃したものがありますか?

4

3 に答える 3

6

onPostExecuteの正しいメソッドをオーバーライドしていません。

あなたが持っている:

protected void onPostExecute(Void result)

必要なもの:

protected void onPostExecute(Object result)

指定した 3 番目のジェネリック パラメータの型が であることに注意してくださいObject。それがonPostExecute引数として使用するタイプです。したがって、 のメソッド シグネチャは、ではなくonPostExecuteを受け入れる必要があります。ObjectVoid

ここでは、オブジェクトではなくブール値の結果タイプを使用し、Json 状態クラス変数を削除する必要があります。これにより、AsyncTask の柔軟性が維持され、実行後に操作が完了したことをユーザーに示すことができます。

于 2013-08-13T13:50:17.353 に答える