-1

我正在尝试将字符串数组传递给我的适配器。我的问题是我全局初始化并尝试在下面的异步任务中创建字符串数组。但我越来越空了。下面是我的代码。实际上,在这个例子中,他们从资源文件夹中获取它,但我想从我的 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 不同,因此请阅读此处的文档

编辑

好的,如果您想让 Activity 从 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;
}

然后最后在接口强制你的Activity实现的函数processData函数中添加listner并按照Activity中的需要处理数据。

于 2013-01-24T11:51:14.850 回答
0

您可以使用 ArrayList 代替使用 String[] 在适配器中设置列表。

于 2013-01-24T11:36:07.940 回答