如何从使用以下内容创建的新线程中获取变量:
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);
?
答案 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
方法时,你可以放入各种各样的东西:
如果在其中定义了AsyncTask类,则访问父类的变量。
class MyClass {
Button b;
boolean flag = false;
// Stuff
class MyAsyncClass extends AsyncTask {
// All the stuff, core work in doInBackground
@Override
void onPostExecute(/*vars*/) {
b.setText("Done");
flag = true;
}
}
}
使用AsyncTask的一般原则:http://developer.android.com/reference/android/os/AsyncTask.html
答案 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);
}
}