从线程Android Java返回一个字符串

时间:2015-06-22 05:47:14

标签: java android multithreading android-fragments android-intent

我使用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();
}

4 个答案:

答案 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";
    }
}