【问题标题】:Get Return Value from Runnable(Thread) in Java [duplicate]从Java中的Runnable(Thread)获取返回值[重复]
【发布时间】:2015-07-29 03:40:30
【问题描述】:

一旦这个线程完成,我有没有办法传递“r”的值?我相信我在 9 或 10 个月前在另一个项目上做过这个,但对于我的一生,我不记得找到代码的项目。我花了大约 5 个小时来挖掘代码和谷歌搜索,但没有找到解决方案,而且由于我不经常使用 Java\Android 进行开发,所以我完全忘记了这一点。

以下是我的代码,以及我上次执行此操作时记得的内容。我有点记得“.call()”或“.get()”但是在尝试在 android 文档中找到一些东西之后。我不确定。我只能找到“可调用”。

public void updateUserProfile(){

if(checkFields(){
//Do Something
}else{
//Do Something
}

}


 public boolean checkFields(){

Boolean r = false;



     Runnable run = new Runnable(){
                    //Boolean r;
                @Override
                public void run() {

                    //Or boolean r;

                    //get value of r.
                    r = php.UpdateProfile.updateProfile(user_id, user_email);
                }
            };

            new Thread(run).start();

            return r; //run.get(r)?
}

【问题讨论】:

  • 您的回复似乎适得其反。如果它很简单,那么请提供解决方案而不是聪明的@$$ 评论。
  • 也许委托人可以帮助您解决问题
  • 您能发布更多代码并向我们展示您需要 r 变量的位置吗?
  • @TyJacobs 试试我的回答。请尊重其他成员。
  • 更新了代码以显示我是如何使用它的。我可以使用 AsyncTask。

标签: java android multithreading runnable


【解决方案1】:

您正在做的是创建一个实现 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);
    }
}

【讨论】:

    【解决方案2】:

    您不能从返回类型为 Void 的方法返回值。

    使用Handler类发送消息,并从线程的run方法调用handler.sendMessage()并在onHandleMessageHandler上处理该消息

    Handler Document link

    Handler example

    【讨论】:

      【解决方案3】:

      试试FutureCallableExecuterService ...这可能对http://www.journaldev.com/1090/java-callable-future-example有帮助

      【讨论】:

        【解决方案4】:

        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);
        

        【讨论】:

          【解决方案5】:

          我最终使用了 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();
                  }
          
              }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-02-02
            • 1970-01-01
            • 2014-09-15
            • 2015-08-22
            • 2017-04-19
            • 2011-02-16
            相关资源
            最近更新 更多