相关疑难解决方法(0)

android asynctask with threading

我创建了一个asynctask并在其doInBackground()方法中启动了这样的线程:

private class myAsyntask extends Asynctask{

    doInBackground(){
    Thread t = new Thread(new Runnable(){
     public void run()
     {
        while(someBoolean!=true){
        Thread.currentThread.sleep(100);
        } 
     }
     });
    }
   onPostExecute(){
  //do something related to that variable
  }
}
Run Code Online (Sandbox Code Playgroud)

我面临的问题是在第一次迭代之后Thread.sleep(),onPostExecute()被调用,而我认为asynctask将在后台运行此线程,当该布尔值为true时onPostexecute()被调用.我无法理解为什么会发生这种情况?

android android-asynctask

4
推荐指数
1
解决办法
1万
查看次数

Android HTML Jsoup解析速度

这是交易.在我的Android应用程序中,我正在使用Jsoup进行一些网络抓取.现在它工作正常,但它太慢了.我在我的代码中做的是:

  1. 在Jsoup中通过POST方法登录页面;
  2. 获取cookie;
  3. 通过重用cookie我将经历6个页面(POST和GET)并抓取它们(主要是表格和许多行.我的意思是很多......所以,真的很多foreach循环);
  4. 将所有必需的数据写入SQLiteDatabase;

现在问题是它速度很快.我的意思是,在按下登录按钮后,在应用程序的登录界面中,用户必须在3G中等待10秒,在WiFi中等待8-10秒(取决于WiFi速度).当他试图检查数据更新时,它会执行相同的算法+比较SQLiteDatabase表数据.

那么,有没有其他方法来做这个HTML解析 - 在android中刮掉东西以使其更快?PS我遗憾地无法访问数据库.

编辑:

既然你问过我正在抓取的内容,这里是你可以在不登录的情况下访问的几个页面的一个例子(与其他人相比,这不是一个很大的表):https://medeine.vgtu.lt/programos/ programa.jsp?sid = F&fak = 5&prog = 87&rus = U&klb = en.

现在,对于代码......我真的不能给你完整的代码,但这里是我如何得到表格的每个单元格的例子:

document = Jsoup.connect(getContext().getString(R.string.url))
                    .cookie("JSESSIONID", cookie)
                    .get();

            Element table = document.select("table.duomenys").first();
            if (table != null) {
                databaseHandler.openDatabase();
                databaseHandler.getDatabase().beginTransaction();
                try {
                    for (Element row : table.select("tr.n, tr.l") {
                        Elements columns = row.select("td");
                        addItem(columns, DatabaseHandler.getTableName());
                    }
                    databaseHandler.getDatabase().setTransactionSuccessful();
                } finally {
                    databaseHandler.getDatabase().endTransaction();
                }
                databaseHandler.closeDatabase();
            }
Run Code Online (Sandbox Code Playgroud)

这是addItem()方法示例:

private void addItem(Elements columns, String tableName) {
    databaseHandler.addItem(new Item(
            columns.get(0).text(),
            columns.get(1).text(), …
Run Code Online (Sandbox Code Playgroud)

performance android web-scraping jsoup

3
推荐指数
1
解决办法
3797
查看次数