0

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

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

4 回答 4

1

您不能从Java 中的 a返回值。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 给出了很好的 方法

于 2013-04-12T11:49:18.597 回答
1

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

于 2013-04-12T11:59:41.553 回答
0

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

于 2013-04-12T11:50:53.963 回答
0

你可以使用未来

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);
    }
}
于 2013-04-12T15:23:05.753 回答