我想使用asynctask下载网站的html内容并在listview中显示结果

时间:2016-08-08 01:55:31

标签: android listview android-asynctask

我想使用asynctask下载网站的html内容,并使用正则表达式来操作源代码以获得我需要的内容,最后我想在列表视图中显示这些结果。这是我的代码它没有显示错误,但当我在我的模拟器上运行时,应用程序崩溃 拜托,我需要助手,这非常重要

public class DownloadTask extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {
        String result = "";
        URL url;
        HttpURLConnection urlConnection = null;

        try {
            url = new URL(urls[0]);
            urlConnection = (HttpURLConnection)url.openConnection();
            InputStream in = urlConnection.getInputStream();
            InputStreamReader reader = new InputStreamReader(in);
            int data = reader.read();

            while (data != -1) {
                char current = (char) data;
                result += current;
                data = reader.read();
            }
            return result;
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ListView myLV = (ListView)findViewById(R.id.teamLV);
    ArrayList<String> clubName = new ArrayList<String>();

    DownloadTask task = new DownloadTask();
    String result = null;
    try {
        result = task.execute("https://www.premierleague.com/clubs").get();
        //Log.i("Content of URL", result);
        System.out.println(result);
        Pattern p = Pattern.compile("class=\"clubName\">(.*?)<");
        Matcher m = p.matcher(result);

        while(m.find()){
            System.out.println(m.group(1));
            clubName.add(m.group(1));
            ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_activated_1, clubName);
            myLV.setAdapter(arrayAdapter);
        }


    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }

}

1 个答案:

答案 0 :(得分:0)

尝试在doInBackground之后添加onPostExecute。然后从execute.get()中删除该部分。 get方法使UI阻塞(这使得asynctask毫无意义)。

每次进行循环时,

也会预设适配器而不是创建新适配器。您可能需要一个自定义适配器(取决于您的需要)。

@Override
protected void onPostExecute(String result) {
    //Log.i("Content of URL", result);
    System.out.println(result);
    Pattern p = Pattern.compile("class=\"clubName\">(.*?)<");
    Matcher m = p.matcher(result);

    while(m.find()){
        System.out.println(m.group(1));
       //  clubName.add(m.group(1));

        adapter.add (m.group(1));

    }
}