所以我试图解析论坛网站上的数据,这是我用于活动的代码:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final ListView listview = (ListView) findViewById(R.id.listView);
final List<String> list = formatTopicData(new TopicRetrievalTask().doInBackground(1));
final StableArrayAdapter adapter = new StableArrayAdapter(this,
android.R.layout.simple_list_item_1, list);
listview.setAdapter(adapter);
}
private class StableArrayAdapter extends ArrayAdapter<String> {
HashMap<String, Integer> mIdMap = new HashMap<String, Integer>();
public StableArrayAdapter(Context context, int textViewResourceId,
List<String> objects) {
super(context, textViewResourceId, objects);
for (int i = 0; i < objects.size(); ++i) {
mIdMap.put(objects.get(i), i);
}
}
@Override
public long getItemId(int position) {
String item = getItem(position);
return mIdMap.get(item);
}
@Override
public boolean hasStableIds() {
return true;
}
}
我也有我的ASync任务:
class TopicRetrievalTask extends AsyncTask<Integer, Void, List<TopicListView.TopicData>> {
protected List<TopicListView.TopicData> doInBackground(Integer... page) {
List<TopicListView.TopicData> topics = new ArrayList<TopicListView.TopicData>();
Document doc;
try {
doc = Jsoup.connect("http://<site>/forums/?page=" + page[0])
.userAgent("Mozilla")
.get();
Elements parsed = doc.select("tr[class=topic]");
for (Element topic : parsed) {
TopicListView.TopicData topicData = null;
topicData.setTitle(topic.select("div").select("a").first().text());
topicData.setUrl(topic.select("div").select("a").first().attr("href"));
topicData.setAuthor(topic.select("small").select("a").first().text());
topics.add(topicData);
}
} catch (IOException e) {
e.printStackTrace();
}
return topics;
}
出于某种原因,我仍然收到错误,说我正在主线程上进行网络连接,而我正在第8行调用异步任务。我知道为什么会这样做?
答案 0 :(得分:0)
好像你试图在doinbackground()方法中操作ui。这就是导致你烦恼的原因。任何类型的ui操作都应该在onpostexecute()方法中完成。
答案 1 :(得分:0)
您正在直接呼叫doInBackground
,如下所示:
new TopicRetrievalTask().doInBackground(1)
但你应该像这样开始AsyncTask
,系统将在后台线程上调用你的doInBackground方法:
new TopicRetrievalTask().execute(1)
请注意,该任务实际上是 async - 您必须等待它完成才能直接使用结果,就像您尝试的那样。
答案 2 :(得分:0)
你不应该调用doInBackground,文档会告诉你必须调用execute()方法。
http://developer.android.com/reference/android/os/AsyncTask.html