【问题标题】:Code after thread not being executed未执行线程后的代码
【发布时间】:2013-04-20 21:52:37
【问题描述】:

我正在为一个 android 应用程序提取一些 html。我遇到的一个问题是下面代码中线程之后的代码没有被执行。我觉得我犯了一个业余错误,但我不明白它是什么。我知道数组列表正在被填充,从在 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());

}

【问题讨论】:

  • 能贴一下logcat的输出吗?
  • 您应该尝试将您发布的代码减少到可以重现您的问题的最小片段。这显然与一周中的日子无关,所有这一切都让这个问题读起来不愉快

标签: java android


【解决方案1】:

我猜你来自传统的 java 开发,所以这里有一个警告:线程和 Android 不喜欢对方。将您的线程切换到Async Task 并重试,只需更改几行代码。

基本上,将所有代码复制到doInBackground() 方法,然后调用task.execute()。 您想要对生成的数据执行的所有操作都应该进入异步任务的onPostExecute() 方法。您甚至可以使用publishResult()onResultPublished() 进行并行处理 请注意,这可能会同步运行,但您不必担心。

【讨论】:

  • 好的,我会试试这个异步任务。它看起来有点乱,但我会弄清楚的。
  • 异步任务是在 android 上运行的方式,我不会称它们为混乱
【解决方案2】:

既然你在线程之后没有做任何 UI 工作,你能不做 finally 子句中的工作吗?

如果你依赖这个线程来收集数据来填充视图,你应该使用 AsyncTask。

【讨论】:

    【解决方案3】:

    尝试将线程分配给一个变量,并在 onCreate 方法结束时启动该线程变量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2023-03-06
      相关资源
      最近更新 更多