我正在为Android应用程序提取一些html。我遇到的一个问题是,下面代码中的线程之后的代码没有被执行。我觉得我犯了一个业余错误,但我不知道它是什么。我知道arraylists正在填充,从在createTimetable()方法中将其内容打印到logcat中。
但是}).start();
之后的任何事情都没有完成。有什么想法吗?
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_display_online_timetable);
Intent intent = getIntent();
value = intent.getStringExtra("url");
new Thread(new Runnable() {
public void run() {
try {
Log.d("url",value);
doc = Jsoup.connect(value).get();
Element monday = doc.select("p ~ table").first();
Element tuesday = doc.select("p ~ table").get(1);
Element wednesday = doc.select("p ~ table").get(2);
Element thursday = doc.select("p ~ table").get(3);
Element friday = doc.select("p ~ table").get(4);
monday.select("tr:eq(0)").remove();
tuesday.select("tr:eq(0)").remove();
wednesday.select("tr:eq(0)").remove();
thursday.select("tr:eq(0)").remove();
friday.select("tr:eq(0)").remove();
final Elements mon = monday.select("td");
final Elements tues = tuesday.select("td");
final Elements wed = wednesday.select("td");
final Elements thurs = thursday.select("td");
final Elements fri = friday.select("td");
Log.d("thread","sdsddssd");
createTimetable(monClasses, mon, day1);
createTimetable(tuesClasses, tues, day2);
createTimetable(wedClasses, wed, day3);
createTimetable(thurClasses, thurs, day4);
createTimetable(friClasses, fri, day5);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
Log.d("sdfsdfsdf", "HELLO");
for(int i = 0; i<monClasses.size();i++)
{
Log.d("monday", monClasses.get(i).toString());
}
mSectionsPagerAdapter = new SectionsPagerAdapter(
getSupportFragmentManager());
}
答案 0 :(得分:2)
我猜你来自传统的java开发,所以这里有一个警告:Threads和Android不喜欢彼此。将您的主题切换到Async Task并再试一次,只需更改几行代码。
基本上,将所有代码复制到doInBackground()
方法,然后调用task.execute()
。
您要对生成的数据执行的所有操作都应该进入Async任务的onPostExecute()
方法。您甚至可以使用publishResult()
和onResultPublished()
进行并行处理
请注意,这可能会同步运行,但您不必担心这一点。
答案 1 :(得分:1)
由于你没有在线程之后做任何UI工作,你不能在finally子句中完成工作吗?
如果您依靠此线程收集数据以填充视图,则应使用AsyncTask。
答案 2 :(得分:0)
尝试将线程分配给变量并在onCreate方法结束时启动该线程变量