2012-05-16 3 views
1

안녕하세요 저는 첫 번째 Android 앱을 통해 작업했으며 조금 느리고 지체되기 시작했습니다. 전에 iPhone 앱을 만들었고 물건을 내 놓아야한다는 것을 알고 있습니다. 그래서 내 질문에 메모리 누출을 피하는 관점에서 안드로이드 코딩을위한 베스트 프랙티스라고 가정한다. JSON 피드의 데이터를로드하고 일반적으로 코드를 간소화하여 사용자 환경을 개선하는 것이 더 효율적 이도록하십시오.Android 코딩 더 효율적이고 효과적으로

가 제공 할 수있는 모든 도움을 주시면 감사 및 안드로이드에 대한 열정을하지만, 단지 내가 당신이해야 잘

을 heres 내 코드의 샘플 지금까지

public class HomeActivity extends ListActivity { 

    private MergeAdapter adapter=null; 
    private ArrayAdapter<String> arrayAdapter=null; 
    private ArrayAdapter<String> arrayAdapter2=null; 
    private ArrayAdapter<String> arrayAdapter3=null; 
    private static final String apiKey = "46fhr636gdbc737hjd92932dd"; 
    private static final String apiUser = "android-app-v1"; 
    private static final String ChosenTeam = null; 
    private static String ChosenMethod = null; 
    public String fulldata = null; 
    public String chosenLeagueId = "40"; 
    public List<String> newsList = null; 
    public List<String> newsList2 = null; 
    public List<String> newsList3 = null; 

    public int newsAmount = 0; 


    long unixTimeStamp = System.currentTimeMillis()/1000L; 

    //add Time Stamp to URL 


    //public String chosenMethod; 


    String newsFeedRequest = "1.0/website/" + chosenLeagueId + "/news?timestamp=" + unixTimeStamp; 
    String fixturesFeedURL = "https://website.com/_services/api/" + newsFeedRequest; 
    private int container; 


    private static String buildHmacSignature(String pKey, String pStringToSign) 
    { 
     String lSignature = "None"; 
     try 
     { 
     Mac lMac = Mac.getInstance("HmacSHA256"); 
     SecretKeySpec lSecret = new SecretKeySpec(pKey.getBytes(), "HmacSHA256"); 
     lMac.init(lSecret); 

     byte[] lDigest = lMac.doFinal(pStringToSign.getBytes()); 
     BigInteger lHash = new BigInteger(1, lDigest); 
     lSignature = lHash.toString(16); 
     if ((lSignature.length() % 2) != 0) { 
      lSignature = "0" + lSignature; 
     } 
     } 
     catch (NoSuchAlgorithmException lEx) 
     { 
     throw new RuntimeException("Problems calculating HMAC", lEx); 
     } 
     catch (InvalidKeyException lEx) 
     { 
     throw new RuntimeException("Problems calculating HMAC", lEx); 
     } 

     return lSignature; 
    } 


    public void checkPreferences(){ 


     SharedPreferences preferences = getSharedPreferences("prefs", Context.MODE_PRIVATE); 
     final String ChosenMethodPref = preferences.getString("ChosenMethod", ChosenMethod); 
     Log.v("myapp", "ChosenMethod Home = " + ChosenMethodPref); 

     if (ChosenMethodPref.equals("Team")) { 
      setContentView(R.layout.homeactteam2); 
      newsAmount = 5; 

     } else { 
      setContentView(R.layout.homeact); 
      newsAmount = 10; 
     } 
} 

    public void loadData(){String myhash = buildHmacSignature(apiKey, fixturesFeedURL); 


    HttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost(fixturesFeedURL); 

    List<NameValuePair> pairs = new ArrayList<NameValuePair>(); 
    pairs.add(new BasicNameValuePair("requestToken", myhash)); 
    pairs.add(new BasicNameValuePair("apiUser", apiUser)); 

    try { 
     post.setEntity (new UrlEncodedFormEntity(pairs)); 
     HttpResponse response = client.execute(post); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent(), "UTF-8")); 
     String json = reader.readLine(); 
     fulldata = String.valueOf(json); 
     Log.v("myApp","newsdata" + fulldata); 

     newsList = new ArrayList<String>(); 
     newsList2 = new ArrayList<String>(); 
     newsList3 = new ArrayList<String>(); 

     JSONObject obj = new JSONObject(json);  
     JSONObject objData = obj.getJSONObject("data"); 
     JSONArray jArray = objData.getJSONArray("news"); 


      for(int t = 0; t < newsAmount; t++){ 
       JSONObject newsTitleDict = jArray.getJSONObject(t); 

      newsList3.add(newsTitleDict.getString("title")); 

      } 

      for(int t = 0; t < 1; t++){ 
       JSONObject newsTitleDict = jArray.getJSONObject(t); 

      newsList.add(newsTitleDict.getString("title")); 
      newsList2.add(newsTitleDict.getString("title")); 

      } 



    } catch (ClientProtocolException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (JSONException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 


    arrayAdapter = new ArrayAdapter<String>(this, R.layout.single_item, newsList); 
    arrayAdapter2 = new ArrayAdapter<String>(this, R.layout.single_item, newsList2); 
    arrayAdapter3 = new ArrayAdapter<String>(this, R.layout.single_item, newsList3); 

     ListView list = getListView(); 
      list.setTextFilterEnabled(true); 

      LayoutInflater inflater = (LayoutInflater) this.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View header = inflater.inflate(R.layout.homeheader, list, false); 
      View header2 = inflater.inflate(R.layout.homeheader2, list, false); 
      View header3 = inflater.inflate(R.layout.homeheader3, list, false); 


    //setListAdapter (arrayAdapter); 


     adapter = new MergeAdapter(); 
     adapter.addView(header); 
     adapter.addAdapter(arrayAdapter); 
     adapter.addView(header2); 
     adapter.addAdapter(arrayAdapter2); 
     adapter.addView(header3); 
     adapter.addAdapter(arrayAdapter3); 
     setListAdapter(adapter); 

    } 
@Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 

     checkPreferences(); 
     loadData(); 


     Button backbtn = (Button) findViewById(R.id.backbtn); 

     //Listening to button event 
     backbtn.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View arg0) { 
       //Starting a new Intent 
       Intent previousScreen = new Intent(getApplicationContext(), ChooseTeamActivity.class); 
       ChosenMethod = "null"; 
       SharedPreferences preferences = getSharedPreferences("prefs", Context.MODE_PRIVATE); 
       SharedPreferences.Editor editor = preferences.edit(); 
       editor.putString("ChosenMethod", ChosenMethod);    
       editor.commit(); 
       previousScreen.putExtra("FullData", fulldata); 
       startActivity(previousScreen); 


      } 
     }); 

    } 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.menu, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    if (item.getItemId() == R.id.home) { 

     startActivity(new Intent(HomeActivity.this, HomeActivity.class)); 

     return(true); 
    } 


    if (item.getItemId() == R.id.match) { 

     startActivity(new Intent(HomeActivity.this, MatchActivity.class)); 

     return(true); 
    } 



    if (item.getItemId() == R.id.teams) { 

     startActivity(new Intent(HomeActivity.this, TeamsActivity.class)); 

     return(true); 
    } 



    if (item.getItemId() == R.id.twitter) { 

     startActivity(new Intent(HomeActivity.this, TwitterActivity.class)); 

     return(true); 
    } 

    if (item.getItemId() == R.id.info) { 

     startActivity(new Intent(HomeActivity.this, InfoActivity.class)); 

     return(true); 
    } 


    return(super.onOptionsItemSelected(item)); 


} 

} 
+5

맨 처음 볼 수있는 것은 메인 스레드에서 네트워크 작업을 수행한다는 것입니다. 별도의 스레드에서 실행하려면 AsyncTask를 사용해야합니다. – Demonick

+1

귀하의 질문은이 사이트의 주제에 관한 것이지만 질문을 http://codereview.stackexchange.com/에 게시하면 더 많은 답변을 얻을 수 있습니다. – THelper

답변

1

그것을하고 있어요 있는지 확인하려면된다 이것 좀보세요 awesome presentation by Romain Guy.

그것은 당신에게 당신이 찾고있는 것들의 내부보기를 제공합니다 당신은 또한 편리한 팁 :

일예의 무리를 얻을 것이다 gui 스레드의 오버로드를 피하려면 AsyncTasksHandlers을 사용하는 것 외에 대부분의 변수를 final으로 선언 할 수 있습니다. 사용자 정의 itemrenderer 구현은 사용자의 GUI (스크롤링) 속도를 크게 향상 시키지만, 좋은 Java 관행은 아니지만 getterssetters 대신 직접 참조를 사용하면 성능이 어느 정도 향상됩니다.

관련 문제