-1

文字列配列をアダプタに渡そうとしています。私の問題は、グローバルに初期化して、以下の非同期タスクで文字列配列を作成しようとすることです。しかし、私はnullとして取得しています。以下は私のコードです。実際、この例では、リソースフォルダーから取得していますが、jsonの応答から取得したいのです。どんな助けでも大歓迎です。

        String[] mString;
        public ActionsAdapter(Context context) {
             mInflater = LayoutInflater.from(context);
             session = new SessionManager(context);
             final Resources res = context.getResources();
             new ConnectAppMenu(context).execute();
             //  mTitles = res.getStringArray(R.array.actions_names);
            //  mUrls = res.getStringArray(R.array.actions_links);
            //  mIcons = res.obtainTypedArray(R.array.actions_icons);
             System.out.println("Menus"+ mString);

         }
         public class ConnectAppMenu extends AsyncTask<String, Void, String> {
    private ProgressDialog dialog;
    private final Context context;
    public ConnectAppMenu(Context context) {
        this.context = context;
    }
     @Override
        protected void onPreExecute() {
        // UI work allowed here
        dialog = new ProgressDialog(context);
        // setup your dialog here
        dialog.setMessage("Connecting....");
        dialog.setCancelable(false);
        dialog.show();
        }
    @Override
    protected String doInBackground(String... params) {
        String returnConnect = doConnectAppMenu();
        return returnConnect;
    }      
    public String doConnectAppMenu() {
        HashMap<String, String> user = session.getUserDetails();
        String client_url = user.get(SessionManager.KEY_CLIENT);
    //  if(connection) {
            HttpParams connectionParameters =  new BasicHttpParams(); 
            int timeoutConnection = 8000;
            HttpConnectionParams.setConnectionTimeout(connectionParameters, timeoutConnection);                 
            int timeoutSocket = 10000;
            HttpConnectionParams.setSoTimeout(connectionParameters, timeoutSocket);
            HttpClient httpClient   =   new DefaultHttpClient(connectionParameters);
            HttpPost httpPost       =   new HttpPost(client_url+"/api/common/app_menu");
            JSONObject json = new JSONObject();    
          try{
            json.put("data", 1);
             json.put("versionid", 1);                          
             StringEntity se = new StringEntity(json.toString());
             se.setContentType(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));
             httpPost.setEntity(se);                       
             //Execute HTTP post request
             appmenu_res    =   httpClient.execute(httpPost); 
             appmenu_obj = new org.json.JSONObject(org.apache.http.util.EntityUtils.toString(appmenu_res.getEntity()));
             appmenu_result = appmenu_obj.toString();

           }
            catch(JSONException ex) {
                // TODO Auto-generated catch block
                ex.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
//  }           
        return appmenu_result;
    }
    @Override
    public void onPostExecute(String result) {

        int status_code = appmenu_res.getStatusLine().getStatusCode();                          
            if (status_code == 200) {
                dialog.dismiss();

                try {
                    menuObject = new JSONObject(result);
                    JSONArray names= menuObject.names();
                    JSONArray values = menuObject.toJSONArray(names);
                        for (int i = 0; i< values.length(); i++) {

                            JSONObject json2 = (JSONObject) values.get(i);
                            int menu_id = json2.getInt("menu_id");

                              if (menu_id > 0) {

                                  if (json2.has("menu_name")) {
                                     menu_list = json2.get("menu_name").toString();
                                     mString = new String[] { menu_list };

                                     //mUrls = menu_list.length();
                                  }

                              } 
                }
                        System.out.println("Json Menu" + Arrays.toString(mString));

                    /*Iterator<String> iter = menuObject.keys();
                    while (iter.hasNext()) {
                        String key = iter.next();
                        try {
                            Object value = menuObject.get(key);
                            //System.out.println("Hai" +value);
                            System.out.println("Post Execute" +  value);

                        } catch (JSONException e) {
                            // Something went wrong!
                        }
                    }*/
                } catch (JSONException e) { 
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                //dialog.dismiss();

            }
    }

}
4

2 に答える 2

1

まず最初に、JSONオブジェクトを文字列として探している場合は、ここで行ったことを実行しないでください。

appmenu_obj = new org.json.JSONObject(org.apache.http.util.EntityUtils.toString(appmenu_res.getEntity()));

次のことをお勧めします。

String Json = EntityUtils.toString(appmenu_res.getEntity());
return Json;

これで、UIスレッドでJSONの処理を実行する場合(文字列である戻りタイプに基づいて処理したい場合)、これは機能するはずです。ただし、Jsonをオブジェクトに処理する必要があり、時間がかかり、UIスレッドが詰まるため、この方法はお勧めしません。

より良い解決策は、バックグラウンドスレッドでJsonをシリアル化してから、シリアル化されたオブジェクトをメインスレッドに戻してUIを更新することです。

多くのタイプがある場合は、ジェネリックを使用することをお勧めします。私はすでに、ここで必要な場合に必要なことを実行できるローダーを構築しました。GSONライブラリを使用して、適切なセラライザーを作成する必要があります。また、ローダークラスの操作は、AsyncTaskClassの操作とは異なるため、こちらのドキュメントをお読みください。

編集

さて、アクティビティにAsyncTaskからのコールバックを持たせたい場合は、次のように実行します。

public class MyActivity extends Activity implements AsyncTaskCallback

ここで、AsyncTaskCallbackは次のようになります。

public interface AsyncTaskCallback
{
    public processData(Object responseObject);
}

これで、onPostExecuteコードで、次のような操作を行う必要があります。

@Override
protected void onPostExecute(Object r){
    if (r != null) {
       l.processData(data);
    }
}

非同期タスクに次の関数を追加します

public void addAsyncTaskListener (final AsyncTaskListener l){
    mCallback = l;
}

最後に、リストナーを追加し、インターフェイスがアクティビティを強制的に実装する関数processData関数のアクティビティで必要に応じてデータを処理します。

于 2013-01-24T11:51:14.850 に答える
0

String []を使用する代わりに、アダプタの設定リストにArrayListを使用できます。

于 2013-01-24T11:36:07.940 に答える