java - 无法从网页下载 html 源

标签 java android multithreading concurrency web-crawler

我在 Android 中从网页下载 html 源代码时遇到问题。我在不同的线程中运行 http 客户端,它能够获取 html 文本(我记录了结果),但后来当我尝试使用下载的 html 文本时,主线程中的变量似乎为空。我认为问题正在上升,因为我无法同步线程,但我现在不知道如何解决它。当我调试代码时,全局变量包含运行函数中的数据,但是当我加入线程并查看 join 方法时,该变量为空。这是我的代码(我在不同线程中运行的类)

公共(public)类(class) LutrijaHr {

public String url;
public String savedHtml;
public LutrijaHr(String s){
    this.url = s;
    savedHtml = "";
}

public String donwloadSource(String passedUrl) throws Exception{
    HttpClient client = new DefaultHttpClient();
    HttpGet request = new HttpGet(passedUrl);
    HttpResponse response = client.execute(request);

    String html = "";
    InputStream in = response.getEntity().getContent();
    BufferedReader reader = new BufferedReader(new InputStreamReader(in));
    StringBuilder str = new StringBuilder();
    String line = null;
    while((line = reader.readLine()) != null)
    {
        str.append(line);
    }
    in.close();
    html = str.toString();
    savedHtml += html;
    return html;
}

}

主类的部分代码:

String test = "";
LutrijaHr lhr = new LutrijaHr("https://www.lutrija.hr");
@Override
public void run() {


    try {

        test = lhr.donwloadSource(lhr.url);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    lhr.savedHtml = test;
    Log.d("test", test);

}

这是我尝试加入线程但变量为空的部分

if (v.getId() == R.id.checkNumber){
        Thread t = new Thread(new LotoMain(), "Page thread");
        t.start();
        try {
            t.join();
            etCheckedNumber.setText(lhr.savedHtml);
            String smrki = test;
            Log.d("testdsadasd", lhr.savedHtml);
            Log.d("BOZO BOZO" ,test) ;

        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            Log.d("BOZO BOZO BOZO" ,test) ;
            e.printStackTrace();

        }
    }

我想在不使用 android asynctask 类的情况下解决这个问题,因为我想了解一些有关线程及其操作方式的知识。

最佳答案

使用“锁定” 将此代码添加到主类中:

public Lock workingLock = new ReentrantLock();
String test = "";
LutrijaHr lhr = new LutrijaHr("https://www.lutrija.hr");
@Override
public void run() {


    try {
        workingLock.lock();
        test = lhr.donwloadSource(lhr.url);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    lhr.savedHtml = test;

    workingLock.unlock;

    Log.d("test", test);

}

现在将其用于:

if (v.getId() == R.id.checkNumber){ Thread t = new Thread(new LotoMain(), "页面线程");

    try {

        try {
            workingLock.lock();

       } catch (Exception e) {

            e.printStackTrace();
       }

        etCheckedNumber.setText(lhr.savedHtml);
        String smrki = test;
        Log.d("testdsadasd", lhr.savedHtml);
        Log.d("BOZO BOZO" ,test) ;

        workingLock.unlock();

    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        Log.d("BOZO BOZO BOZO" ,test) ;
        e.printStackTrace();

    }
}

关于java - 无法从网页下载 html 源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28136517/

相关文章:

java - 尝试某些请求时出现 Spring Security 和 Angular 401 错误

java - JNI UnsatisfiedLinkError - 未找到 native 方法

android - textNoSuggestions 被 2.0.1 模拟器忽略

ruby - 确定 ruby 线程状态

WPF 调度程序 - 突然出现 "stuck"并且在按下某个键之前不处理操作

java - 为 jOOQ 单元测试创​​建一个类似对象的任意表

java - 创建一个包含 Java 泛型的新数组

java - 将功能委托(delegate)给 Java 中的子类

安卓市场应用链接

java - Java中同步关键字的使用