-1

したがって、アプリケーションのいくつかの部分から呼び出すことができる一方で、(ネットワーク呼び出しを行うため) UI スレッドのハングを回避するために、public static メソッド内に配置した Async タスクがあります。Async タスクは正常に動作し、JSONOBJECT を返します (これを確認するためにコードの一部をログに記録しました)。ただし、問題は public static メソッドを使用しているため、戻り値の型が必要です (場合によっては JSONOBJECT を返す必要があります) が、常に null を返します。 Async タスクによって取得された JSONOBJECT。以下のコード。

public class JSONmethod {
    static InputStream is = null;
    static String res = "";
    static JSONObject jArray = null;
public static JSONObject getJSONfromURL(final String url){


    new AsyncTask<String, Void, JSONObject>() {

        @Override
        protected JSONObject doInBackground(String... params) {

    try{
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(url);
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            is = entity.getContent();



    }
    catch(Exception e){
            Log.e("log_tag", "Error in http connection "+e.toString());
    }


    try{
            BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");
            }
            is.close();
            res=sb.toString();
    }
    catch(Exception e){
            Log.e("log_tag", "Error converting result "+e.toString());
    }
    Log.i("Result BG ", res);
    try{

        jArray = new JSONObject(res);            
    }catch(JSONException e){
            Log.e("log_tag", "Error parsing data "+e.toString());
    }
    return jArray; //at this point the JSONOBJECT has been fetched

     }



    }.execute();
    return jArray;  //Always null
 }

}

4

2 に答える 2

4

メソッドが非同期であると想定されている場合、現在JSONの結果を返すことはできません...

あなたができることは、結果が利用可能になったときに呼び出される非同期タスクへのコールバックを提供することです。

    public class JSONmethod {
    static InputStream is = null;
    static String res = "";
    static JSONObject jArray = null;

    public static interface JSONCallback {
        public void onResult(JSONObject result);
    }

    public static void getJSONfromURL(final String url, final JSONCallback callback) {

        new AsyncTask<String, Void, JSONObject>() {

            @Override
            protected JSONObject doInBackground(String... params) {

                try {
                    HttpClient httpclient = new DefaultHttpClient();
                    HttpPost httppost = new HttpPost(url);
                    HttpResponse response = httpclient.execute(httppost);
                    HttpEntity entity = response.getEntity();
                    is = entity.getContent();

                } catch (Exception e) {
                    Log.e("log_tag",
                            "Error in http connection " + e.toString());
                }

                try {
                    BufferedReader reader = new BufferedReader(
                            new InputStreamReader(is, "iso-8859-1"), 8);
                    StringBuilder sb = new StringBuilder();
                    String line = null;
                    while ((line = reader.readLine()) != null) {
                        sb.append(line + "\n");
                    }
                    is.close();
                    res = sb.toString();
                } catch (Exception e) {
                    Log.e("log_tag",
                            "Error converting result " + e.toString());
                }
                Log.i("Result BG ", res);
                try {

                    jArray = new JSONObject(res);
                } catch (JSONException e) {
                    Log.e("log_tag", "Error parsing data " + e.toString());
                }

                callback.onResult(jArray);

                return jArray; // at this point the JSONOBJECT has been
                                // fetched

            }

        }.execute();
    }
}

そして、あなたはそれをそのように使うでしょう:

    JSONmethod.getJSONfromURL(url, new JSONCallback() {

        @Override
        public void onResult(JSONObject result) {
            // Do whatever you want with the result
        }
    });
于 2012-11-13T08:52:14.310 に答える
2

非同期タスクの基本は、メソッドを呼び出した直後にその結果を戻り値として取得しないことです。

あなたの呼び出し(静的かどうかに関係なく)は、タスクを作成するための手順のみを実行し(実行せずに!)、すぐに戻ります。システムは、実際のタスク プロセス コードをすぐに実行しない場合があります (キューに以前のタスクがいくつかある場合など)。AsyncTask.doInBackground() メソッドを終了し、AsyncTask.onPostExecute() を呼び出した後、タスクは終了します。デフォルトでは、どのメソッドも呼び出しません。AsyncTask.onPostExecute() メソッドで UI を更新するために必要なことはすべて自分の責任で行ってください。

于 2012-11-13T08:57:01.530 に答える