2012-06-07 5 views
1

안녕하세요, JSON 피드를 다운로드하고 레그가되기 시작합니다. AsyncTask를 사용해야하지만 내 코드에이를 통합하는 방법을 잘 모르는 사람은 누구입니까? 그것을 통합하는 가장 좋은 방법입니다.안드로이드 AsyncTask를 통합하는 방법

을 heres 내 원래의 코드 지금까지

public class HomeActivity extends ListActivity { 

    private MergeAdapter adapter=null; 
    private ArrayAdapter<String> arrayAdapter=null; 
    private ArrayAdapter<String> arrayAdapter2=null; 
    private LazyAdapter arrayAdapter3=null; 
    private static final String apiKey = "7668hhf74hhd3dhhs"; 
    private static final String apiUser = "androiduser"; 
    private static String ChosenLeagueID = null; 
    private static String ChosenMethod = null; 
    private static String ChosenTeamId = null; 
    public String fulldata = null; 
    public String newsFeedRequest = null; 
    public String newsFeedURL = null; 
    public String resultsFeedURL = null; 
    public String lastMonth = null; 
    public String HomeTeam = null; 
    public String AwayTeam = null; 
    public String HomeScore = null; 
    public String AwayScore = null; 
    public String Attendance = null; 
    public String Division = null; 
    public String HomeScorers = null; 
    public String AwayScorers = null;  

    public String resultsFeedRequest = null; 
    public String chosenLeagueId = "40"; 
    public List<String> newsList = null; 
    public List<String> newsList2 = null; 
    public List<String> newsList3 = null; 
    public List<String> imageList = null; 
    public JSONObject resultsDict = null; 
    public View resultsView = null; 



    public int newsAmount = 0; 

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

    //add Time Stamp to URL 
    //public String chosenMethod; 
    public class PostTask extends AsyncTask<Void, String, Boolean> { 

     @Override 
     protected Boolean doInBackground(Void... params) { 
      boolean result = false; 
     checkPreferences(); 


      publishProgress("progress"); 
      return result; 
     } 

     protected void onProgressUpdate(String... progress) { 
      StringBuilder str = new StringBuilder(); 
       for (int i = 1; i < progress.length; i++) { 
        str.append(progress[i] + " "); 
       } 

     } 

    } 

    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); 
     ChosenMethod = preferences.getString("ChosenMethod", ChosenMethod); 
     ChosenLeagueID = preferences.getString("ChosenLeagueId", ChosenLeagueID); 
     ChosenTeamId = preferences.getString("ChosenTeamId", ChosenTeamId); 








     Log.v("lc", "newsurl" + newsFeedURL); 


     Log.v("myapp", "ChosenMethod Home = " + ChosenMethod); 
     Log.v("myapp", "ChosenLeagueID Home = " + ChosenLeagueID); 
     Log.v("myapp", "ChosenTeamID Home = " + ChosenTeamId); 

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



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

} 


    public void loadresults(){ 

    resultsFeedRequest = "1.0/league-website/" + chosenLeagueId + "/results?&team_id=" + ChosenTeamId + "&limit=31&timestamp=" + unixTimeStamp; 
    resultsFeedURL = "https://www.website.com/_services/api/" + resultsFeedRequest; 

    String myhash = buildHmacSignature(apiKey, resultsFeedURL); 

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

    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","resultsdata" + fulldata); 

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


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


     if(jArray.length() < 1){ 

      loadLastResults(); 

     }else{ 

      Log.v("lc", "this month has results"); 

     } 


//  
//   for(int t = 0; t < newsAmount; t++){ 
//    JSONObject newsTitleDict = jArray.getJSONObject(t); 
//    imageList.add(newsTitleDict.getString("image_small")); 
//   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(); 
    } 


} 



public void loadLastResults(){ 

resultsFeedRequest = "1.0/league-website/" + chosenLeagueId + "/results?month=04&team_id=" + ChosenTeamId + "&limit=31&timestamp=" + unixTimeStamp; 
resultsFeedURL = "https://www.website.com/_services/api/" + resultsFeedRequest; 

String myhash = buildHmacSignature(apiKey, resultsFeedURL); 

Date anotherCurDate = new Date(); 
SimpleDateFormat formatter = new SimpleDateFormat("MM"); 
String CurMonth = formatter.format(anotherCurDate); 

int Int = Integer.parseInt(CurMonth); 

int MonthInt = Int -1; 





CurMonth = (String) (String.valueOf(MonthInt)); 



if (CurMonth.equals("1")){ 

    lastMonth = "12"; 

}  
else { 
    if(CurMonth.length() < 2){ 
     lastMonth = "0" + CurMonth; 
    } else { 
     lastMonth = CurMonth; 
    } 
} 





Log.v("lc","month= " + CurMonth); 
Log.v("lc","LastMonth= " + lastMonth); 


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

    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","resultsdata" + fulldata); 

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


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


      for(int t = 0; t < 1; t++){ 

       resultsDict = jArray.getJSONObject(t); 
       HomeTeam = resultsDict.getString("hometeam"); 
       AwayTeam = resultsDict.getString("awayteam"); 
       HomeScore = resultsDict.getString("homescore"); 
       AwayScore = resultsDict.getString("awayscore"); 
       Attendance = resultsDict.getString("attendance"); 
       Division = resultsDict.getString("division"); 


       Log.v("lc","hometeam" + HomeTeam); 
       Log.v("lc","awayteam" + AwayTeam); 


      } 

      resultsView = LayoutInflater.from(getBaseContext()).inflate(R.layout.resultscell, 
        null); 

      TextView homeTeam = (TextView) resultsView.findViewById(R.id.HomeTeam); 
      homeTeam.setText(HomeTeam); 

      TextView awayTeam = (TextView) resultsView.findViewById(R.id.AwayTeam); 
      awayTeam.setText(AwayTeam); 

      TextView homeScore = (TextView) resultsView.findViewById(R.id.HomeScore); 
      homeScore.setText(HomeScore); 

      TextView awayScore = (TextView) resultsView.findViewById(R.id.AwayScore); 
      awayScore.setText(AwayScore); 

      TextView attendance = (TextView) resultsView.findViewById(R.id.Attendence); 
      attendance.setText("Att:" + Attendance); 

      TextView division = (TextView) resultsView.findViewById(R.id.Division); 
      division.setText(Division); 






      Log.v("lc", "resultsDict" + resultsDict); 





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


} 




    public void loadnews(){ 

     newsFeedRequest = "1.0/league-website/" + chosenLeagueId + "/news?timestamp=" + unixTimeStamp; 
     newsFeedURL = "https://www.website.com/_services/api/" + newsFeedRequest; 

    String myhash = buildHmacSignature(apiKey, newsFeedURL); 



    Log.v("lc" , "resultsurl=" + resultsFeedURL); 
    HttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost(newsFeedURL); 

    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>(); 
     imageList = new ArrayList<String>(); 


     JSONObject obj = new JSONObject(json);  
     JSONObject objData = obj.getJSONObject("data"); 
     JSONArray jArray = objData.getJSONArray("news"); 
     Log.v("lc","newsAmount= " + newsAmount); 

      for(int t = 0; t < newsAmount; t++){ 
       JSONObject newsTitleDict = jArray.getJSONObject(t); 
       imageList.add(newsTitleDict.getString("image_small")); 
      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(); 
    } 


} 

public void mergeAdapterSetup(){  


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



    String[] mStrings = (String[]) imageList.toArray(new String[imageList.size()]); 
    String[] news = (String[]) newsList3.toArray(new String[newsList3.size()]); 




    arrayAdapter3 = new LazyAdapter(this, mStrings, news); 


     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.addView(resultsView); 
     adapter.addView(header3); 
     adapter.addAdapter(arrayAdapter3); 
     setListAdapter(adapter); 
} 

public void loadDataLeague(){ 

    String myhash = buildHmacSignature(apiKey, newsFeedURL); 


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

    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>(); 
     imageList = new ArrayList<String>(); 


     JSONObject obj = new JSONObject(json);  
     JSONObject objData = obj.getJSONObject("data"); 
     JSONArray jArray = objData.getJSONArray("news"); 
     Log.v("lc","newsAmount= " + newsAmount); 

      for(int t = 0; t < newsAmount; t++){ 
       JSONObject newsTitleDict = jArray.getJSONObject(t); 
       imageList.add(newsTitleDict.getString("image_small")); 
      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(this, R.layout.complex_item, newsList3); 

    String[] mStrings = (String[]) imageList.toArray(new String[imageList.size()]); 
    String[] news = (String[]) newsList3.toArray(new String[newsList3.size()]); 


    arrayAdapter3 = new LazyAdapter(this, mStrings, news); 


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

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


    //setListAdapter (arrayAdapter); 


     adapter = new MergeAdapter(); 
     adapter.addView(header3); 
     adapter.addAdapter(arrayAdapter3); 
     setListAdapter(adapter); 

    } 

    public void loadData(){ 
     loadresults(); 

     loadnews(); 
     mergeAdapterSetup(); 
    } 

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

     PostTask jsontask; 
     jsontask = new PostTask(); 
     jsontask.execute(); 





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


} 


} 

오류

java.lang.NullPointerException 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1821) 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1842) 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at android.app.ActivityThread.access$1500(ActivityThread.java:132) 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1038) 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at android.os.Looper.loop(Looper.java:143) 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at android.app.ActivityThread.main(ActivityThread.java:4263) 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at java.lang.reflect.Method.invokeNative(Native Method) 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at java.lang.reflect.Method.invoke(Method.java:507) 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at dalvik.system.NativeStart.main(Native Method) 
    06-07 12:56:34.338: E/AndroidRuntime(2688): Caused by: java.lang.NullPointerException 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at HomeActivity.onCreate(HomeActivity.java:637) 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1072) 
    06-07 12:56:34.338: E/AndroidRuntime(2688):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1785) 

답변

1

여성용 비동기 작업의 예를 들어, 당신은 정말 비동기 작업에 넣어해야 안드로이드 3.0>이 때문에 일부 그것에 대한 규칙은 없습니다 ...

비동기 작업에 넣어야합니다. 3.0에서 기본 스레드에서 실행하지 마십시오.

사용이 :

public class JsonTask extends AsyncTask<Void, String, Boolean> { 

     @Override 
     protected Boolean doInBackground(Void... params) { 
      boolean result = false; 

      //All your code goes in here 

      //If you want to do something on the UI use progress update 

      publishProgress("progress"); 
      return result; 
     } 

     protected void onProgressUpdate(String... progress) { 
      StringBuilder str = new StringBuilder(); 
       for (int i = 1; i < progress.length; i++) { 
        str.append(progress[i] + " "); 
       } 

     } 
    } 

당신은

JsonTask jsontask; 

그때 당신은 내가 잠시 동일한 문제를 겪고 그것을

jsontask = new JsonTask(); 
jsontask.execute(); 

를 시작해야 비동기 작업 외부에 대한 참조가 필요합니다 전에 좋은,

+0

그래서 만약 내가 loadnews() loadresults() 및로드 Lastresults() 당신이 어디 hav 모든 코드를 넣으면 여기에 들어가야합니다. –

+0

비동기 작업에서 비동기 작업을 호출하면 비동기 작업에서 호출해야합니다. – FabianCook

+0

aysnc 작업은 클래스 자체의 스레드로 간주하고 onProgressUpadte 메서드는 비동기 작업과 기본 스레드 (Ui 스레드) 사이의 다리입니다 – FabianCook

관련 문제