如何从线程获取返回值? [英] How get return value from Thread?

查看:68
本文介绍了如何从线程获取返回值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在将Thread用于Webservice,但是我无法从Thread获取数据,因为我无法从Thread返回数据.

I am using Thread for Webservice but i cant get the data from Thread because i cant return data from Thread.

这是我的WebService.java:

public class Webservice {
    static String result;
    public static String readUrl(final String url) {
        Thread thread = new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    HttpClient client = new DefaultHttpClient();
                    HttpPost method = new HttpPost(url);
                    HttpResponse response = client.execute(method);
                    InputStream stream = response.getEntity().getContent();
                    result = ConvertInputStreamToString(stream);
                    Log.i("xxx","OK" + result);

                } catch (ClientProtocolException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
            thread.start();
            return result;
    }

    private static String ConvertInputStreamToString(InputStream inputstteam) {
        try {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    inputstteam));
            StringBuilder builder = new StringBuilder();
            String line = "";

            while ((line = reader.readLine()) != null) {
                builder.append(line);
            }
            return builder.toString();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
}

这是NotesActivity.java:

public class NotesActivity extends Activity {

    private ArrayList<StructTask> nettasks = new ArrayList<StructTask>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Thread thread = new Thread(new Runnable() {

            @Override
            public void run() {
                String result = Webservice.readUrl("http://192.168.200.101:8081/note-server/");
                if (result != null) {
                    try {
                        JSONArray tasks = new JSONArray(result);
                        for (int i = 0; i < tasks.length(); i++) {
                            JSONObject object = tasks.getJSONObject(i);
                            //Log.i("LOG", "Task: " + object.getString("task_title"));
                            StructTask task = new StructTask();
                            task.id = object.getLong("task_id");
                            task.title = object.getString("task_title");
                            task.desc = object.getString("task_desc");
                            task.done = object.getBoolean("task_done");
                            nettasks.add(task);

                            for (StructTask taskes : nettasks) {
                                Log.i("LOG", "Taskes: " + taskes.id + "|" + taskes.title + "|" + taskes.desc + "|" + taskes.done);
                            }
                        }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                } 
                else
                {
                    Log.i("OK", "TaskesOK: " + result);
                    Log.i("LOG", "Task: " + "NULL");
                }

            }
        });
        thread.start();

    }
}

这是我的StructTask.java:

public class StructTask {
    public long id;
    public String title;
    public String desc;
    public boolean done;
}

此代码为我返回NULL.

This code return for me NULL .

推荐答案

只需尝试这种方式

1)Webservice.java

public class Webservice {
        public interface WebCallListener{
            void onCallComplete(String result);
        }
        public static void readUrl(final String url,final WebCallListener callListener) {
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        HttpClient client = new DefaultHttpClient();
                        HttpPost method = new HttpPost(url);
                        HttpResponse response = client.execute(method);
                        InputStream stream = response.getEntity().getContent();
                        callListener.onCallComplete(ConvertInputStreamToString(stream));
                    } catch (ClientProtocolException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            });
            thread.start();
        }

        private static String ConvertInputStreamToString(InputStream inputstteam) {
            try {
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        inputstteam));
                StringBuilder builder = new StringBuilder();
                String line = "";

                while ((line = reader.readLine()) != null) {
                    builder.append(line);
                }
                return builder.toString();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
            return null;
        }
    }

2)NotesActivity.java

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Webservice.readUrl("http://192.168.200.101:8081/note-server/",new WebCallListener() {
            @Override
            public void onCallComplete(String result) {
                if (result != null) {
                    try {
                        JSONArray tasks = new JSONArray(result);
                        for (int i = 0; i < tasks.length(); i++) {
                            JSONObject object = tasks.getJSONObject(i);
                            //Log.i("LOG", "Task: " + object.getString("task_title"));
                            StructTask task = new StructTask();
                            task.id = object.getLong("task_id");
                            task.title = object.getString("task_title");
                            task.desc = object.getString("task_desc");
                            task.done = object.getBoolean("task_done");
                            nettasks.add(task);

                        }
                        for (StructTask taskes : nettasks) {
                                Log.i("LOG", "Taskes: " + taskes.id + "|" + taskes.title + "|" + taskes.desc + "|" + taskes.done);
                            }
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }
                else
                {
                    Log.i("OK", "TaskesOK: " + result);
                    Log.i("LOG", "Task: " + "NULL");
                }
            }
        });

    }

这篇关于如何从线程获取返回值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆