我在 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/