在学习中,难免有一些坑,每次遇到坑我就和大家分享一下,在okhttp中我们成功的访问后台,然后从onResponse中获得了返回的json数据(安卓和后台一般用json格式做数据交互),然后你会发现这个返回的数据你只能在onResponse方法内调用,放到方法外,这个数据就不好用,也不是不好用就是你弄不出去,追根揭底就是okhttp是异步请求,你没办法将异步请求的结果放到主线程中使用,但是我们有没有方法做到上面效果呢?有的,往下看

   @Override
    public ArrayList<Music> call() throws Exception {
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder()
                .url(httpURL+"/HttpWeb/selectMusicInformation")//请求的url
                .get()
                .build();
        Call call = client.newCall(request);
        call.enqueue(new Callback() {

            @Override
            public void onFailure(Call call, IOException e) {

            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final  String res = response.body().string();

                        try{
                            Gson gson = new Gson();
                            list = gson.fromJson(res, new TypeToken<ArrayList<Music>>() {
                            }.getType());
                        }catch (JsonSyntaxException e){
                            e.printStackTrace();
                        }
            }
        });
        return list;
    }

call()这个方法是继承了Callable这个接口,它可以等你的异步线程完成了,然后将你获得的数据作为方法的返回值,这样你就可以获得这个数据

public class MainActivity extends Activity implements View.OnClickListener,Callable<ArrayList<Music>>{


反正我在写这个okhttp的方法在这里耽误了好几天,结果就是异步线程的数据,没办法在主线程中调用,Callable()这个接口中的方法恰好可以等你的异步线程完成了,然后把结果返回,这样就可以在主线程中使用,我不知道这样会不会给程序带来麻烦,只是为了完成功能。大佬勿喷


Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐