如何从Android中的新线程(new Runnable(){public void run(){}获取价值

时间:2015-03-24 11:01:42

标签: java android multithreading

这是我的代码,在我的课程中,我已经将ansResultinThread变量声明如下。

protected static  String ansResultinThread = "";

我在callServerForResult方法完成后尝试访问ansResultinThread值。我没有收到更新的值。

public void callServerForResult(String ans, String casCmd) {

    // String ParsedEquation = parseQuestionForSymPy(ans);
    String ParsedEquation = ans;

    final String stringUrl = "http://localhost:40001/" + casCmd + "/"
            + ParsedEquation;

    new Thread(new Runnable() {
        public void run() {
            String Result = "";
            try {
                Result = GetServerResult(stringUrl);

            } catch (IOException e) {
                System.out.println(e);
            }
            ansResultinThread = Result;
        }
    }).start();
}

如何解决此问题。

2 个答案:

答案 0 :(得分:1)

好吧,因为它是异步发生的,你需要使用Future接口(参见这里:http://www.vogella.com/tutorials/JavaConcurrency/article.html,8。期货和可赎回)

答案 1 :(得分:1)

您的解决方案不起作用,因为callServerForResult在线程启动后立即返回。

另请注意,使用具有多个线程的静态变量通常不是一个好主意。

我认为最简单的解决方案是使用AsyncTask代替Thread

如果你想保留Thread,另一个解决方案是使用回调。

private final Handler handler = new Handler();

// Definition of the callback interface
public interface Callback {
    void onResultReceived(String result);
}

public void callServerForResult(String ans, String casCmd, final Callback callback) {

    // String ParsedEquation = parseQuestionForSymPy(ans);
    String ParsedEquation = ans;

    final String stringUrl = "http://localhost:40001/" + casCmd + "/"
            + ParsedEquation;

    new Thread(new Runnable() {
        public void run() {
            try {
                final String result = GetServerResult(stringUrl);

                // Use a handler to invoke the callback on the main thread
                handler.post(new Runnable() {
                    public void run() {
                        callback.onResultReceived(result);
                    }
                });
            } catch (IOException e) {
                System.out.println(e);
            }
        }
    }).start();
}

// Usage
callServerForResult("...", "...", new Callback() {
    public void onResultReceived(String result) {
        // Do something with the result
    }
});

如果回调代码需要在与调用者(通常是主线程)相同的线程上运行,则Handler是必需的