8

私は最近 AsyncTask を読んでテストしましたが、onPostExecute 部分で複数の値を渡す方法を知る必要があります。さて、私はJSONパーサーを使用してWebから値を取得しますが、JSONから取得した値は複数の値であり、それらの値を取得した各データの列ヘッダーで区切られた配列に渡します。これは私がそれを返すはずの部分ですonPostExecute で使用します。しかし、私が知る限り、リターンは実行ごとに 1 回しか使用できません (間違っている場合は訂正してください)。

これまでの私のコードは次のとおりです。

public class GetInfo extends AsyncTask<String, Void, List<String>>{

        private final String TAG = null;
        InputStream is = null;
        StringBuilder sb=null;
        List<String> list = new ArrayList<String>();

        @Override
        protected List<String> doInBackground(String... url) {
            String result = "";

            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

                //CONNECT TO DATABASE
                 try{
                         HttpClient httpclient = new DefaultHttpClient();
                         HttpPost httppost = new HttpPost(url[0]);
                         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                         HttpResponse response = httpclient.execute(httppost);
                         HttpEntity entity = response.getEntity();
                         is = entity.getContent();
                         Log.v(TAG, "connected");
                 }catch(Exception e){
                         Log.v(TAG, "run failed");

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

                 //BUFFERED READER FOR INPUT STREAM
                try{
                     BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                     sb = new StringBuilder();
                     String line = "0";

                     while ((line = reader.readLine()) != null) {
                             sb.append(line + "\n");
                     }
                     is.close();
                     result=sb.toString();
                     Log.v(TAG, "buffered read");
                 }catch(Exception e){
                     Log.v(TAG, "buffered error");
                         Log.e("log_tag", "Error converting result "+e.toString());
                 }

                //CONVERT JSON TO STRING
                try{
                     Log.v(TAG, result);

                         JSONArray jArray = new JSONArray(result);
                         JSONObject json_data=null;

                         for(int i=0;i<jArray.length();i++){
                             Log.v(TAG, "loop start");

                                 json_data = jArray.getJSONObject(i);
                                 list.add(json_data.getString("id"));
                                 list2.add(json_data.getString("city"));
                                 Log.v(TAG, "list added");
                         }

                 }catch(JSONException e){
                     Log.v(TAG, "rest failed");
                         Log.e("log_tag", "Error parsing data "+e.toString());
                 }

                 Log.v(TAG, list.toString());

                return list; //I also need to return the list2 here

        }

        @Override
        protected void onPostExecute(List<String> result) {
            cities = result; //lost in this part hahaha!
            showCities();
        }

    }

付け加えると、このコードは、文字列配列 (リスト) を 1 つだけ返す場合は正常に機能しますが、2 番目の部分で混乱します。また、都市は Main クラスで宣言され、ShowCities() は表示のみに使用されます。だから私はコードを追加する気にしません。

4

2 に答える 2

5

あなたができることの1つは、ArrayListを静的にして、必要なときにアクセスすることです。

public static List<String> LIST = new ArrayList<String>();
public static List<String> LIST1 = new ArrayList<String>();

public class GetInfo extends AsyncTask<String, Void, List<String>>{

        private final String TAG = null;
        InputStream is = null;
        StringBuilder sb=null;


        @Override
        protected List<String> doInBackground(String... url) {
            String result = "";

            ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();

                //CONNECT TO DATABASE
                 try{
                         HttpClient httpclient = new DefaultHttpClient();
                         HttpPost httppost = new HttpPost(url[0]);
                         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                         HttpResponse response = httpclient.execute(httppost);
                         HttpEntity entity = response.getEntity();
                         is = entity.getContent();
                         Log.v(TAG, "connected");
                 }catch(Exception e){
                         Log.v(TAG, "run failed");

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

                 //BUFFERED READER FOR INPUT STREAM
                try{
                     BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
                     sb = new StringBuilder();
                     String line = "0";

                     while ((line = reader.readLine()) != null) {
                             sb.append(line + "\n");
                     }
                     is.close();
                     result=sb.toString();
                     Log.v(TAG, "buffered read");
                 }catch(Exception e){
                     Log.v(TAG, "buffered error");
                         Log.e("log_tag", "Error converting result "+e.toString());
                 }

                //CONVERT JSON TO STRING
                try{
                     Log.v(TAG, result);

                         JSONArray jArray = new JSONArray(result);
                         JSONObject json_data=null;

                         for(int i=0;i<jArray.length();i++){
                             Log.v(TAG, "loop start");

                                 json_data = jArray.getJSONObject(i);
                                 LIST.add(json_data.getString("id"));
                                 LIST1.add(json_data.getString("city"));
                                 Log.v(TAG, "list added");
                         }

                 }catch(JSONException e){
                     Log.v(TAG, "rest failed");
                         Log.e("log_tag", "Error parsing data "+e.toString());
                 }

                 Log.v(TAG, list.toString());

                return LIST; //I also need to return the list2 here

        }

        @Override
        protected void onPostExecute(List<String> result) {
            cities = result; //lost in this part hahaha!
            showCities();
        }

    }

必要なときに LIST と LIST1 の両方を使用できるようになりました。また、DoInBackground で arraylist を返す必要がない場合もあります。

それがあなたを助けることを願っています。

于 2012-08-22T11:02:02.360 に答える
3

2 つのリストを持つ新しいクラスを作成します。そのクラスを戻り値の型として使用します。

于 2012-08-22T11:26:02.737 に答える