2013-01-24 48 views
-1

我想通過一個字符串數組到我的適配器。我的問題是我全局初始化並嘗試在下面的異步任務中創建字符串數組。但我越來越空。以下是我的代碼。其實在這個例子中,他們把它從資源文件夾埠我想從我的JSON響應。任何幫助表示讚賞。如何將字符串數組傳遞到我的適配器在android

 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(); 

      } 
    } 

} 
+0

請提供較短/較乾淨的代碼併發布logcat。 – ben75

回答

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。

如果你有很多類型,我會建議使用泛型。我已經構建了一個可以做你想要的裝載器,如果你想要的話here.你需要使用GSON庫並構建適當的seralizers。另外隨着裝載機類的工作是不同與AsyncTaskClass工作,所以請閱讀文檔here

編輯

好了,所以你想要做什麼,如果你想獲得活動有來自的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函數中的Activity中的要求。

+0

@CTulip可以告訴如何獲取上面填充的字符串數組上下文仍然是空..... – user1048958

+0

你想要一個回調,你可以在你的活動中使用?例如。一個你可以更新UI的地方? –

+0

是的,我發佈我的代碼太高於.... – user1048958

0

代替使用String [],您可以使用ArrayList來設置適配器中的列表。

+0

我初始化了全局數組列表,並在異步任務中填充列表,但是在我的ActionsAdapter(上下文上下文)公共方法中,當我嘗試打印它時爲null .... – user1048958

相關問題