我使用Thread来执行HttpURLConnection并从我的数据库中获取数据。下面的代码代表了我想要完成的内容,但我在行上出现错误
str_Data =“John Doe”;
错误:从内部类
中访问变量'str_Data'public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.MainActivity);
String str_Name = "";
str_Name = setDataToText(str_Url);
}
private String setDataToText(String urlStr) {
final String url = urlStr;
String str_Data = "";
new Thread() {
public void run() {
//A code to retrieve data is executed
//Data is Converted and added to the string str_Data;
str_Data = "John Doe";
}
}
return str_Data;
}
我想在我的新Thread()上的run()操作中将str_Data的值设置为从我的数据库中恢复的数据。
修改: 这就是我解决问题的方法,请告诉我使用这种方法是不是很好的做法,谢谢你的帮助:
String str_Data = "";
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.MainActivity);
setDataToText(str_Url);
txtName.setText(str_Data);
}
private void setDataToText(String urlStr) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//A code to retrieve data is executed
//Data is Converted and added to the string str_Data;
str_Data = "John Doe";
}
}).start();
}
答案 0 :(得分:2)
使用界面使其正常工作。
private interface DataListener{
void onDataReady(String data);
}
private String str_Name = "";
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.MainActivity);
setDataToText(str_Url, new DataListener() {
@Override
public void onDataReady(String data) {
str_Name = data;
System.out.println(str_Name);
}
});
}
private void setDataToText(final String urlStr,final DataListener dataListener) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//A code to retrieve data is executed
//Data is Converted and added to the string str_Data;
String str_Data = "John Doe";
dataListener.onDataReady(str_Data);
}
}).start();
}
答案 1 :(得分:1)
你可以这样做。
String str_Data = "";
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.MainActivity);
String str_Name = "";
str_Name = setDataToText(str_Url);
}
private String setDataToText(String urlStr) {
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
//A code to retrieve data is executed
//Data is Converted and added to the string str_Data;
str_Data = "John Doe";
}
}).start();
return str_Data;
}
答案 2 :(得分:0)
您无法更改该线程内局部变量的值。 如果要访问该线程中的变量,则需要将它们声明为 final ,这意味着您无法更改其值。
基本上没有意义从你的案例中的一个线程返回一个值,因为你无法知道该值何时准备就绪。
有多种选项可以使用你从数据库中获得的值:你可以使用监听器,eventbus(谨慎使用),你可以将str_Data声明为该类中的一个字段(但要注意屏幕旋转时会发生什么) 。 因此,如果您需要在布局中显示该值,则可以在启动线程时显示进度条,并隐藏它+设置线程完成其工作时在布局中获得的值
答案 3 :(得分:0)
正确的方法是使用Callable和Future接口。
public static void main(String[] args) throws ExecutionException, InterruptedException {
ExecutorService executorService = Executors.newSingleThreadExecutor();
CallableClass callableClass = new CallableClass();
Future<String> future = executorService.submit(callableClass);
String name = future.get();
System.out.println(name);
}
public class CallableClass implements Callable<String> {
@Override
public String call() throws Exception {
return "John Doe";
}
}