从Java中的Runnable(线程)获取返回值
有没有一种方法可以让我在这个线程完成后传递“r”的值?我相信我在9个月或10个月前在另一个项目上做过这件事,但就我的一生而言,我记不起寻找代码的项目了。我花了大约5个小时在代码和谷歌上搜索,但没有找到一个解决方案,因为我不经常用Java\Android开发,所以我完全忘记了这一点 下面是我的代码,我想我记得上次我这么做的时候。我记得有一个“.call()”或“.get()”,但是在尝试在android文档中找到一些东西之后。我不太确定。我只能找到“callable”从Java中的Runnable(线程)获取返回值,java,android,multithreading,runnable,Java,Android,Multithreading,Runnable,有没有一种方法可以让我在这个线程完成后传递“r”的值?我相信我在9个月或10个月前在另一个项目上做过这件事,但就我的一生而言,我记不起寻找代码的项目了。我花了大约5个小时在代码和谷歌上搜索,但没有找到一个解决方案,因为我不经常用Java\Android开发,所以我完全忘记了这一点 下面是我的代码,我想我记得上次我这么做的时候。我记得有一个“.call()”或“.get()”,但是在尝试在android文档中找到一些东西之后。我不太确定。我只能找到“callable” 不能从返回类型为Void的方
不能从返回类型为Void的方法返回值 使用
Handler
类发送消息,并从线程的run方法调用Handler.sendMessage()
并在Handler的onHandleMessage
上处理此消息
尝试使用未来
,可调用
,执行器服务
。。。这可能会有帮助您正在做的是创建一个实现Runnable的匿名内部类的实例。因此,您可以访问包含类的字段。将代码的结果存储在其中一个中
当然,要注意在主线程和此处创建的线程之间同步对该结果变量的访问
public class TestThreads {
static int r = 0;
public static void main(String[] args) {
Runnable run = new Runnable() {
public void run() {
r = 20;
}
};
Thread t = new Thread(run);
t.start();
try {
t.join();
}
catch(InterruptedException e) {
return;
}
System.out.println("Result: " + r);
}
}
Runnable不会返回。您将需要使用实现Callable的Future或使用FutureTask
ExecutorService pool = Executors.newFixedThreadPool(poolSize);
FutureTask<String> future =
new FutureTask(new Callable() {
public String call() {
String res = ...;
return res;
});
pool.execute(future);
String res = future.get();
// use the line below if you want to set a timeout for the task
String res = future.get(timeoutmillis, TimeUnit.MILLISECONDS);
ExecutorService pool=Executors.newFixedThreadPool(poolSize);
未来任务未来=
新建FutureTask(新的可调用(){
公共字符串调用(){
字符串res=。。。;
返回res;
});
执行(未来);
String res=future.get();
//如果要为任务设置超时,请使用下面的行
String res=future.get(timeoutmillis,TimeUnit.millises);
我最终使用了AsyncTask。由于支持要求,我希望它保持超级简单,但AsyncTask做到了我需要的
private class updateUserProfile extends AsyncTask<Boolean, Boolean, Boolean>{
@Override
protected Boolean doInBackground(Boolean... params) {
return php.UpdateProfile.updateProfile(etEditAddress.getText().toString(),
etEditCity.getText().toString(),
spnStates.getSelectedItem().toString(), etEditZip.getText().toString(), etEditPhone.getText().toString(), etEditAddress.getText().toString());;
}
public void onPostExecute(String result) {
// execution of result of Long time consuming operation
Toast.makeText(MyAccount.this, result.toString(), Toast.LENGTH_LONG).show();
}
}
私有类updateUserProfile扩展异步任务{
@凌驾
受保护的布尔doInBackground(布尔…参数){
返回php.UpdateProfile.UpdateProfile(etEditAddress.getText().toString(),
etEdit.getText().toString(),
spnStates.getSelectedItem().toString()、etEditZip.getText().toString()、etEditPhone.getText().toString()、etEditAddress.getText().toString());;
}
public void onPostExecute(字符串结果){
//执行耗时较长的操作的结果
Toast.makeText(MyAccount.this,result.toString(),Toast.LENGTH_LONG).show();
}
}
您的回答似乎适得其反。如果答案很简单,请帮助解决问题,而不是发表一个聪明的@$$评论。也许一位代表可以帮助您解决问题。您可以发布更多代码并向我们展示您需要r变量的位置吗?@TyJacobs请尝试我的答案。请尊重其他成员。更新代码以显示我如何使用r变量它。我可以使用异步任务。
private class updateUserProfile extends AsyncTask<Boolean, Boolean, Boolean>{
@Override
protected Boolean doInBackground(Boolean... params) {
return php.UpdateProfile.updateProfile(etEditAddress.getText().toString(),
etEditCity.getText().toString(),
spnStates.getSelectedItem().toString(), etEditZip.getText().toString(), etEditPhone.getText().toString(), etEditAddress.getText().toString());;
}
public void onPostExecute(String result) {
// execution of result of Long time consuming operation
Toast.makeText(MyAccount.this, result.toString(), Toast.LENGTH_LONG).show();
}
}