如何从新线程中获取变量?

时间:2013-04-12 11:47:09

标签: java android json multithreading

如何从使用以下内容创建的新线程中获取变量:

public class ParseJson 
{
    public static String parsejson(String strHttpGet)
    {
        Thread thread = new Thread(new Runnable()
        {
            public String run(String strHttpGet)
            {
                String decodeJson = "someJson";
                return decodeJson;
            }
        });
            thread.start();
    }
}

我是说如何将解码后的json返回到我的函数parseJson并将其返回给我的函数调用String decodedJson = ParseJson.parseJson(strHttpGet);

4 个答案:

答案 0 :(得分:1)

您无法从Java中的Thread返回值。实际上,run()没有返回类型。

您可以使用保存结果的共享自定义Object。将其声明为final,因此您可以在匿名子类中访问它(这相当于传递对子类的引用),并在工作完成时调用它上面的setter。

public class ParseJson {
    public static String parsejson(final String strHttpGet) {
        final StringHolder ob = new MyObject();
        Thread thread = new Thread() {
            public String run() {
                String decodeJson = "someJson";
                ob.setResult(decodeJson);
            }
        };
        thread.start();
    }
    private static class StringHolder (){
        private String result;
        public String getResult() { return result; }
        public void setResult(String r) { result = r; }
    }
}

我不确定我理解为什么你说将已解码的json返回到我的函数parseJson并将其返回给我的函数调用。你是说在Thread完成之前你会等待那个功能吗?如果这是您想要的(再次,为什么要开始Thread?),您可以使用Thread.join()

虽然如果您希望在Thread完成时收到通知,您应该考虑另一个选项。 Neil和Waqas给了good approaches

答案 1 :(得分:1)

在android中,你已经将这个问题标记为,在这种情况下使用AsyncTask会更简单,因为当你覆盖onPostEXecute方法时,你可以放入各种各样的东西:

答案 2 :(得分:0)

您甚至可以使用Observer/Observable模式。

答案 3 :(得分:0)

您可以使用Future

public class Json {
    private static final ExecutorService executor = Executors.newCachedThreadPool();

    public static String parse(final String strHttpGet)
            throws TimeoutException, InterruptedException, ExecutionException {
        Future<String> jsonTask = executor.submit(new Callable<String>() {
                    @Override
                    public String call() throws Exception {
                        String decodeJson = decodeJson(strHttpGet);
                        return decodeJson;
                    }

                    private String decodeJson(String strHttpGet) {
                        // TODO do actual parsing
                        return null;
                    }
                });
        // Allow the parsing to take one second
        return jsonTask.get(1, TimeUnit.SECONDS);
    }
}