0

JsonObj クラスのインスタンスを呼び出す MainActivity クラスがあります。JsonObj は AsynchTask を拡張します。以下に貼り付けます。

    public class JsonObj extends AsyncTask<String, Void, JSONObject>{
    int tid;
    String term;

    @Override
    protected JSONObject doInBackground(String... url) {
        // TODO Auto-generated method stub
        DefaultHttpClient   httpclient = new DefaultHttpClient(new BasicHttpParams());
        HttpPost httppost = new HttpPost(url[0]);
        JSONObject jsonObject = null;
        // Depends on your web service
        httppost.setHeader("Content-type", "application/json");

        InputStream inputStream = null;
        String result = null;
        try {
            HttpResponse response = httpclient.execute(httppost);           
            HttpEntity entity = response.getEntity();

            inputStream = entity.getContent();
            // json is UTF-8 by default
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"), 8);
            StringBuilder sb = new StringBuilder();

            String line = null;
            while ((line = reader.readLine()) != null){
                sb.append(line + "\n");
            }
            result = sb.toString();
//          Log.e("JSON-Test [RESULT]: ", result);
            jsonObject = new JSONObject(result);
        } catch (Exception e) { 
            Log.e("JSON-Test [exception]: ", e.toString());
        }
        finally {
            try{if(inputStream != null)inputStream.close();}catch(Exception squish){}
        }

        return jsonObject;
    }

    @Override
    protected void onPostExecute(JSONObject result) {
        // TODO Auto-generated method stub
        super.onPostExecute(result);
    }
}

私が達成しようとしているのは、サーバーから JSON を取得して返す任意のアクティビティから呼び出すことができる AsyncTask クラスです。

私の問題は、AsyncTask クラスが JSON を正常にフェッチすることですが、アクティビティに戻すのに苦労しています。

AsyncTask の完了時に OnPostExecute 関数がデータを返すことはわかっていますが、Activity クラスのデータにアクセスしようとしてもうまくいきません。

new JsonObj().execute("http://myserver/json");JsonObj クラスを呼び出すために使用しています。

OnpostExecute を呼び出して、AsynchTask がサーバーから取得したデータに直接アクセスするにはどうすればよいですか、またはこの問題のより良い解決策は何ですか?

4

3 に答える 3

0

これを行う最善の方法は、Callback. このパターンでは、 Activityに実装するインターフェイスを作成します。次に、メソッドで実行されるように、このインターフェイス コールバックでメソッドを設定します。たとえば、次の基本的な AsyncTask は、完了時にコールバック関数を呼び出します。onPostExecute()

public class JsonObj extends AsyncTask<Void, Void, JSONObject> {

    private OnSuccessListener listener;
    private String url;

    public JsonObj(String url, OnSuccessListener listener) {
        this.url = url;
        this.listener = listener;
    }

    @Override
    protected JSONObject doInBackground(Void... params) {
        //handle url getter. returning the JSONObject here will send it to the onPostExecute method.
    }

    @Override
    protected void onPostExecute(JSONObject json) {
        if (listener != null)
            listener.onSuccess(json);
    }

    public interface OnSuccessListener {
        public void onSuccess(JSONObject json);
    }
}

次に、これを適切に使用するには、Activity で次のようにします。

new JsonObj("http://myserver/json", new OnSuccessListener() {
    @Override
    public void onSuccess(JSONObject json) {
        //TODO: handle new JSONObject.
    }
}).execute();

より単純なコード化済みのソリューションが必要な場合は、私が作成したdroidQueryライブラリを検討してください。アニメーションや一般的な UI タスクを簡素化するだけでなく、この種のネットワーク呼び出しを大幅に簡素化できます。上記のコードは、 Activityで次のように圧縮できます。

$.ajax(new AjaxOptions().url("http://myserver/json")
                        .type("POST")
                        .dataType("JSON")
                        .headers(new Headers().content_type("application/json"))
                        .success(new Function() {
    @Override
    public void invoke($ d, Object... args) {
        JSONObject json = (JSONObject) args[0];
        //TODO: handle json
    }
});
于 2013-10-16T01:37:52.713 に答える