2012-08-26 2 views
0

안녕하세요, 백그라운드에서 XML 파일에서 데이터를 구문 분석하고 해당 배열 배열 데이터를 ListView에 표시 할 ASyncTask 만들려고합니다. 지금까지 내가 잘못하고있는 것을 이해하지 못했거나 String Array 값을 다시 GUI로 반환하는 방법을 모르겠습니다. 여기에 필요한 코드가 있으면 알려주세요. 보고 더 많은 것을 알기 위해 어떤 제안이나 장소를 찾아 주셔서 감사합니다.ASyncTask 및 문자열 배열 값을 하나에서 반환

package com.lvlup.kikurself.scotttest; 

import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.ArrayList; 
import android.app.ListActivity; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
import android.widget.Toast; 
import java.io.IOException; 
import org.xml.sax.SAXException; 

//import com.lvlup.kikurself.scotttest.WikiParser.Cm; 

public class scottPlayers extends ListActivity { 

public class PlayerGet extends AsyncTask<Void, Void, Void>{ 


@Override 
protected void onPostExecute(Void result){ 

WikiParser p = new WikiParser(); 
ArrayList<String> titles = new ArrayList<String>(); 

try { 
    p.parseInto(new URL("http://scottlandminecraft.wikia.com/api.php?action=query&list=categorymembers&cmtitle=Category:Players&cmlimit=500&format=xml"), titles); 

} catch (MalformedURLException e) { 
} catch (IOException e) { 
} catch (SAXException e) {} 

    //String[] values = new String[50]; 
    //values = res; 




    ArrayAdapter<String> adapter = new ArrayAdapter<String>(scottPlayers.this, R.layout.main, titles); 

    setListAdapter(adapter); 

    //final ListView playersList = getListView(); 


    /*playersList.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View v, int position, long thisID) 
    { 
     Object o = (playersList.getItemAtPosition(position)); 
     String playerName_temp = (o.toString()); 

     Intent newIntent = new Intent(v.getContext(), playerDisp.class); 
     newIntent.putExtra("tempN", playerName_temp); 
     startActivity(newIntent); 

    } 
    });*/ 

} 

@Override 
protected void onPreExecute() { 
    // TODO Auto-generated method stub 
    Toast.makeText(scottPlayers.this, 
    "onPreExecute \n: preload bitmap in AsyncTask", 
    Toast.LENGTH_LONG).show(); 
} 


@Override 
protected Void doInBackground(Void... params) { 
    // TODO Auto-generated method stub 

    return null; 
} 


} 


@Override 
public void onCreate(Bundle icicle) { 
super.onCreate(icicle); 

setContentView(R.layout.main); 

new PlayerGet().execute(); 
} 


    //get your data back again with: String fName = getIntent().getExtras().getInt("fname"); 




} 

편집 :이 내가 때우기하지만 에뮬레이터에서이 프로그램을 실행할 때 지금은 단지리스트하지 않는 내 main.xml에의 배경을 보여줍니다 무엇인가 다른 예보고 후 새로운 코드를 추가 채워 넣고 ICS를 실행하는 휴대 전화로이 파일을 가져 오면 오류가 발생하고 강제 종료된다는 메시지가 나타납니다 ... 어떤 이유에서든 에뮬레이터에서이 오류가 발생하지 못하고 LogCat에 오류가 없었습니다. 에뮬레이터.

답변

1

도움을 요청하기 전에 설명서를 읽는 습관을 가지십시오. 필요한 모든 것은 here입니다.

특히 PlayerGet 클래스에서 onPostExecute를 구현해야합니다. 백그라운드 작업이 끝나고 ArrayList가 콜백에 대한 인수로 반환 될 때 호출됩니다.

두 가지 유용한 정보도 있습니다. 항상 표준 Java 명명 규칙을 따르십시오. 클래스 이름 "scottPlayers"는 대문자로 시작해야합니다. 또한 절대적으로 필요한 경우가 아니라면 Object 사용을 피하십시오. 타입 캐스팅과 타입 체크는 나중에 고통의 세계를 저장합니다.

+0

고마워, 내가이 주제에 대해 더 많이 읽기 전에 여기로 바로 뛰어 들었다. 미안하지만, 약간의 추가가 있었고 때로는이 모든 것에 너무 바보 같았다.하지만 할 수있는 모든 것을 배우고 싶다. 내가 읽은 내용과 발견 한 다른 사례를 기반으로 코드를 업데이트했지만 여전히 문제를 제기하고 있습니다. 모든 의견을 듣고 있으면 매우 기쁠 것입니다. 이제까지 내가 할 수있는 일에 대한 의견이 필요해 내가 바꿀 수 있다고 말할 수있다. 사이먼 고마워. – kikurself

+0

SO는 학습자와 숙련 된 프로그래머를위한 커뮤니티 접근 방식에 기반한 나의 신념입니다. 학습자로서, 당신이해야 할 일은 문제를 해결하기 위해 노력했다는 것을 보여주는 것입니다. 결국 사람들에게 시간을 보내고 도움을 청할 때만 공평합니다. 그러므로 문제가있는 새로운 질문을 가지고 다시 오십시오. 코드를 표시하고 예외가 발생하면 logcat 출력을 보냅니다. 그렇게하면 학습자를 돕는 것이 담당자를 향상시킬 수있는 좋은 방법이기 때문에 많은 사람들이 기꺼이 도와 줄 것입니다. 행운을 빕니다! – Simon

2
public class scottPlayers extends ListActivity { 

    private ArrayAdapter<String> mAdapter; 

    @Override 
    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 

     mAdapter = new ArrayAdapter<String>(this, 
       android.R.layout.simple_list_item_1, new ArrayList<String>()); 

     setListAdapter(mAdapter); 

     new PlayerGet().execute(); 
    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     Object o = l.getItemAtPosition(position); 
     String playerName_temp = o.toString(); 

     Intent newIntent = new Intent(v.getContext(), playerDisp.class); 
     newIntent.putExtra("tempN", playerName_temp); 
     startActivity(newIntent); 
    } 


    private class PlayerGet extends AsyncTask<Void, Void, ArrayList<String>> { 

     WikiParser p = new WikiParser(); 
     ArrayList<String> titles = new ArrayList<String>(); 

     @Override 
     protected ArrayList<String> doInBackground(Void... urls) { 
      try { 
       p.parseInto(new URL("http://scottlandminecraft.wikia.com/api.php?action=query&list=categorymembers&cmtitle=Category:Players&cmlimit=500&format=xml"), titles); 
      } catch (MalformedURLException e) { 
      } catch (IOException e) { 
      } catch (SAXException e) {} 
      return titles; 
     } 

     @Override 
     protected void onPostExecute(ArrayList<String> result) { 
      for (String item : result) { 
       mAdapter.add(item); 
      } 
     } 
    } 
} 

변경할 코드가 너무 많으면 AsyncTask docs을 읽으십시오. 특히 execute()onPostExecute()입니다.