Java 异步任务新手问题
我不明白为什么变量“vysledek”在从活动调用void“Send”后保持不变。我可能不完全理解异步任务的工作方式。谢谢你的帮助Java 异步任务新手问题,java,android,class,android-asynctask,Java,Android,Class,Android Asynctask,我不明白为什么变量“vysledek”在从活动调用void“Send”后保持不变。我可能不完全理解异步任务的工作方式。谢谢你的帮助 public class Tools{ public String vysledek; public void Send() { Poslat Poslat = new Poslat(); Poslat.execute(); } private class Poslat extends AsyncTask<String
public class Tools{
public String vysledek;
public void Send() {
Poslat Poslat = new Poslat();
Poslat.execute();
}
private class Poslat extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
vysledek = "something I want it to be";
}
@Override
protected void onPostExecute(String result){
vysledek = "something I want it to be 2";
}
但这会导致崩溃。定时。asnc任务发生在另一个线程上。但是,当操作系统切换到该线程时,由操作系统决定。它应该很快发生(接下来的几百毫秒),但它不一定是立即发生的,所以如果你立即检查它,你可能会或不会看到它发生了变化。正确放置需要异步任务运行的代码的位置是onPostExecute。您应该在异步任务完成后分配它
public class Tools{
public String vysledek;
public void Send() {
Poslat Poslat = new Poslat();
Poslat.execute(vysledek);
}
private class Poslat extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
}
@Override
protected void onPostExecute(String result){
vysledek = "I should be here";
}
}
公共类工具{
公共字符串vysledek;
公共无效发送(){
Poslat Poslat=新的Poslat();
Poslat.execute(vysledek);
}
私有类Poslat扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…URL){
}
@凌驾
受保护的void onPostExecute(字符串结果){
vysledek=“我应该在这里”;
}
}
在调用“Send()”的活动中,您试图在哪里访问vysledek?这会导致崩溃,因为vysledek在AsyncTask完成之前是空的。查看@cadocx answer以了解正确的访问方法。我这样更改了它,但我需要活动等待,我不知道如何操作。最好在异步任务完成时调用equals(“.”equals(Tools.vysledek))以避免空指针异常。但是有没有办法让活动等待它完成?这违背了异步执行的目的。将所有需要它的代码放在onPostExecute()中我想取消它。我这样做只是为了访问HttpClient;)无论如何都要在PostExecute上执行。如果你不这样做,你的整个UI将冻结并且没有响应,看起来你的应用程序坏了。用户将不知道发生了什么。
public class Tools{
public String vysledek;
public void Send() {
Poslat Poslat = new Poslat();
Poslat.execute(vysledek);
}
private class Poslat extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... urls) {
}
@Override
protected void onPostExecute(String result){
vysledek = "I should be here";
}
}