2013-01-24 2 views
-1

문자열 배열을 어댑터에 전달하려고합니다. 내 문제는 전 세계적으로 초기화하고 아래 비동기 작업에 문자열 배열을 만들려고합니다. 그러나 나는 null로 받고있다. 아래는 제 코드입니다. 실제로이 예제에서는 리소스 폴더에서 가져와서 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 라이브러리를 사용하고 적절한 seralizer를 작성해야합니다. 또한 로더 클래스로 작업하기 때문에 문서를 읽어 주시기 바랍니다 AsyncTaskClass 작업에 다른 here

편집

좋아, 그래서 당신이 AsyncTask를에서 콜백을 가지고 활동을 취득하려는 경우 수행 할 작업 의 라인을 따라 뭔가를하는 것입니다

public class MyActivity extends Activity implements AsyncTaskCallback 

AsyncTaskCallback 보이는 곳에 뭔가 같은 :

public interface AsyncTaskCallback 
{ 
    public processData(Object responseObject); 
} 
마지막으로 청취자를 추가하고 데이터를 처리

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

하고 비동기 작업 후

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

과에 다음 함수를 추가 : 0

이제 onPostExecute 코드에서 당신은 같은 somehting을 수행해야합니다 함수 processData 함수의 활동에서 필요에 따라 인터페이스가 사용자 활동을 강제 실행합니다.

+0

@ CTulip은 위에 배열 된 문자열 배열을 얻는 방법을 알려줄 수 있습니다 e 컨텍스트 여전히 null ..... – user1048958

+0

당신은 당신의 활동에서 함께 일할 수있는 콜백을 원했습니까? 예. UI를 업데이트 할 수있는 장소? –

+0

네, 너무 위의 코드를 게시했습니다 .... – user1048958

0

String []을 사용하는 대신 어댑터의 설정 목록에 ArrayList를 사용할 수 있습니다.

+0

배열 목록을 전역으로 초기화하고 목록을 비동기 작업으로 채 웁니다.하지만 인쇄하려고 할 때 내 ActionsAdapter (Context context) 공용 메서드에서 ......... – user1048958