Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java中的Runnable(线程)获取返回值_Java_Android_Multithreading_Runnable - Fatal编程技术网

从Java中的Runnable(线程)获取返回值

从Java中的Runnable(线程)获取返回值,java,android,multithreading,runnable,Java,Android,Multithreading,Runnable,有没有一种方法可以让我在这个线程完成后传递“r”的值?我相信我在9个月或10个月前在另一个项目上做过这件事,但就我的一生而言,我记不起寻找代码的项目了。我花了大约5个小时在代码和谷歌上搜索,但没有找到一个解决方案,因为我不经常用Java\Android开发,所以我完全忘记了这一点 下面是我的代码,我想我记得上次我这么做的时候。我记得有一个“.call()”或“.get()”,但是在尝试在android文档中找到一些东西之后。我不太确定。我只能找到“callable” 不能从返回类型为Void的方

有没有一种方法可以让我在这个线程完成后传递“r”的值?我相信我在9个月或10个月前在另一个项目上做过这件事,但就我的一生而言,我记不起寻找代码的项目了。我花了大约5个小时在代码和谷歌上搜索,但没有找到一个解决方案,因为我不经常用Java\Android开发,所以我完全忘记了这一点

下面是我的代码,我想我记得上次我这么做的时候。我记得有一个“.call()”或“.get()”,但是在尝试在android文档中找到一些东西之后。我不太确定。我只能找到“callable”


不能从返回类型为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();
        }

    }