android从线程内返回结果

时间:2018-08-23 23:23:42

标签: android

我有一个upload(String base_code)方法,该方法采用base64编码的字符串形式的文件, 此方法向api端点发出带有base64字符串的发布请求,以将文件上传到服务器中, 如果上传成功,则api端点将返回200状态代码。

 public static void upload(final String base_code) {

    Thread thread = new Thread(new Runnable() {

        @Override
        public void run() {
            try  {

                Request request;
                RequestBody request_body;
                Response response;
                MultipartBody.Builder body = new MultipartBody.Builder();

                body.setType(MultipartBody.FORM);
                body.addFormDataPart("img", base_code);

                request_body = body.build();
                request = new Request.Builder().url("https://api/endpoint/upload").post(request_body).build();
                response = client.newCall(request).execute();

            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    });

    thread.start();

}

我希望方法upload()返回true或false,表示上传是否成功, 但是我不能这样做,因为代码在自己的线程中执行。我该怎么做?

发布请求是通过okhttp3库完成的,我可以通过检查response.code()来确定上传是否成功。

谢谢

2 个答案:

答案 0 :(得分:0)

使用AsyncTask。您可以在thread方法中执行doInBackground,然后通过uiThread方法将数据传递回onPostExecute

检出this

答案 1 :(得分:0)

我更喜欢使用ExecutorServiceAsyncTask。立即使用线程很难管理。

使用ExecutorService监视任务状态:

ExecutorService es = Executors.newCachedThreadPool();
Future future = es.submit(new Runnable() {
    @Override
    public void run() {
       // Http post here
    }
});

然后您可以调用Future的方法来检查执行状态。

使用AsyncTask:

private class postTask extends AsyncTask<String, Integer, Boolean> {

    @Override
    protected Boolean doInBackground(String... strings) {
        // Http post here
        return result == 200;
    }

    @Override
    protected void onPostExecute(Boolean success) {
        super.onPostExecute(success);
        // Do something according to `success`
    }
}

然后调用execute(url)executeOnExecutor(es, url)开始;