Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >等待Retrofit API更新后再创建Android分片视图

等待Retrofit API更新后再创建Android分片视图
EN

Stack Overflow用户
提问于 2019-08-15 09:31:05
回答 1查看 103关注 0票数 0

我尝试使用geolocation来获取经度/经度坐标,并通过API使用它们来获取天气数据,但是android视图在更新坐标之前就完成了。默认情况下,它最终使用0.0,并将其传递给API链接。返回坐标后,我可以使用什么方法来强制线程等待或更新视图?

代码语言:javascript
运行
AI代码解释
复制
public class Frag1 extends Fragment  {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";
    OnHeadlineSelectedListener callback;
    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    private OnFragmentInteractionListener mListener;

    private static final String FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
    private static final String COURSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
    private static final int LOCATION_PERMISSION_REQUEST_CODE = 1234;
    private Boolean mLocationPermissionsGranted = false;
    private FusedLocationProviderClient mFusedLocationProviderClient;
    public Button sendButton;
    TextView  description, tempTextView, cityNameTextView, humidityTextView, pressureTextView, windSpeedTextView;;
    private WebView MapsView;

    ImageView weatherIcon;

    public Frag1() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment Frag1.
     */
    // TODO: Rename and change types and number of parameters
    public static Frag1 newInstance(String param1, String param2) {
        Frag1 fragment = new Frag1();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);

        }


    }

    public void setOnHeadlineSelectedListener(OnHeadlineSelectedListener callback) {
        this.callback = callback;
    }
    // This interface can be implemented by the Activity, parent Fragment,
    // or a separate test implementation.
    public interface OnHeadlineSelectedListener {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.fragment_frag1, container, false);
        sendButton = v.findViewById(R.id.sendButton);
        pressureTextView = v.findViewById(R.id.pressureTextView);
        windSpeedTextView = v.findViewById(R.id.windSpeedTextView);
        humidityTextView = v.findViewById(R.id.humidityTextView);
        cityNameTextView = v.findViewById(R.id.cityNameTextView);
        description = v.findViewById(R.id.descriptionTextView);
        tempTextView = v.findViewById(R.id.tempTextView);

        ((MainActivity)getActivity()).getLocationPermission();
        ((MainActivity)getActivity()).getDeviceLocation();

        //final WeatherForcast forcast = retrofit.create(WeatherForcast.class);

        return v;
    }

    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://api.openweathermap.org")
                .addConverterFactory(JacksonConverterFactory.create())
                .build();
        final WeatherService service = retrofit.create(WeatherService.class);
            Call<WeatherOutputData> callRequest = service.getWeatherInfo(Double.toString(lat), Double.toString(lon), "imperial", "API_ID");

            callRequest.enqueue(new Callback<WeatherOutputData>() {
                @Override
                public void onResponse(Call<WeatherOutputData> call, Response<WeatherOutputData> response) {
                    WeatherOutputData data = response.body();

                    cityNameTextView.setText(data.getName());
                    tempTextView.setText(data.getMain().getTemp() + "°F");
                    description.setText("Clouds: " + data.getWeather().get(0).getDescription());
                    humidityTextView.setText("Humidity: " + data.getMain().getHumidity() + "%");
                    pressureTextView.setText("Pressure: " + data.getMain().getPressure() + "ppi");
                    windSpeedTextView.setText("Wind Speed: " + data.getWind().getSpeed() + " MPH");
                    String icon = data.getWeather().get(0).getIcon();
                    String iconUrl = "http://openweathermap.org/img/w/" + icon + ".png";
                    //Picasso.get().load(iconUrl).into(weatherIcon);
                }

                @Override
                public void onFailure(Call<WeatherOutputData> call, Throwable t) {
                    Log.d("null", t.getMessage());
                }
            });
        }


    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    /**
     * This interface must be implemented by activities that contain this
     * fragment to allow an interaction in this fragment to be communicated
     * to the activity and potentially other fragments contained in that
     * activity.
     * <p>
     * See the Android Training lesson <a href=
     * "http://developer.android.com/training/basics/fragments/communicating.html"
     * >Communicating with Other Fragments</a> for more information.
     */
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }
}
代码语言:javascript
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity implements Frag1.OnHeadlineSelectedListener {
    private static final String FINE_LOCATION = Manifest.permission.ACCESS_FINE_LOCATION;
    private static final String COURSE_LOCATION = Manifest.permission.ACCESS_COARSE_LOCATION;
    private static final int LOCATION_PERMISSION_REQUEST_CODE = 1234;
    private Boolean mLocationPermissionsGranted = false;
    private FusedLocationProviderClient mFusedLocationProviderClient;
    public static double lat, lon;

    public FragmentRefreshListener getFragmentRefreshListener() {
        return fragmentRefreshListener;
    }

    public void setFragmentRefreshListener(FragmentRefreshListener fragmentRefreshListener) {
        this.fragmentRefreshListener = fragmentRefreshListener;
    }

    private FragmentRefreshListener fragmentRefreshListener;

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

        getLocationPermission();
        getDeviceLocation();

        SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(this, getSupportFragmentManager());
        ViewPager viewPager = findViewById(R.id.view_pager);
        viewPager.setAdapter(sectionsPagerAdapter);
        TabLayout tabs = findViewById(R.id.tabs);
        tabs.setupWithViewPager(viewPager);
        FloatingActionButton fab = findViewById(R.id.fab);



    }
    public void onAttachFragment(Fragment fragment) {
        if (fragment instanceof Frag1) {
            Frag1 headlinesFragment = (Frag1) fragment;
            headlinesFragment.setOnHeadlineSelectedListener(this);
        }
    }
    public interface FragmentRefreshListener{
        void onRefresh();
    }

    public void getDeviceLocation(){
        mFusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this);
        try{
            if(mLocationPermissionsGranted){
                final Task location = mFusedLocationProviderClient.getLastLocation();
                location.addOnCompleteListener(new OnCompleteListener() {
                    @Override
                    public void onComplete(@NonNull Task task) {
                        if(task.isSuccessful()){
                                Log.d("YAY", "GOT LOCATION");
                                Location currentLocation = (Location) task.getResult();
                                lat = currentLocation.getLatitude();
                                lon = currentLocation.getLongitude();

                        }else{
                            Log.d("null", "onComplete: current location is null");
                        }
                    }
                });
            }
        }catch (SecurityException e){
            Log.e("tag", "getDeviceLocation: SecurityException: " + e.getMessage() );
        }
    }

    public void getLocationPermission(){
        Log.d("tag", "getLocationPermission: getting location permissions");
        String[] permissions = {Manifest.permission.ACCESS_FINE_LOCATION,
                Manifest.permission.ACCESS_COARSE_LOCATION};

        if(ContextCompat.checkSelfPermission(this.getApplicationContext(),
                FINE_LOCATION) == PackageManager.PERMISSION_GRANTED){
            if(ContextCompat.checkSelfPermission(this.getApplicationContext(),
                    COURSE_LOCATION) == PackageManager.PERMISSION_GRANTED){
                mLocationPermissionsGranted = true;

            }else{
                ActivityCompat.requestPermissions(this,
                        permissions,
                        LOCATION_PERMISSION_REQUEST_CODE);
            }
        }else{
            ActivityCompat.requestPermissions(this,
                    permissions,
                    LOCATION_PERMISSION_REQUEST_CODE);
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        Log.d("tag", "onRequestPermissionsResult: called.");
        boolean mLocationPermissionsGranted = false;

        switch(requestCode){
            case LOCATION_PERMISSION_REQUEST_CODE:{
                if(grantResults.length > 0){
                    for(int i = 0; i < grantResults.length; i++){
                        if(grantResults[i] != PackageManager.PERMISSION_GRANTED){
                            mLocationPermissionsGranted = false;
                            Log.d("tag", "onRequestPermissionsResult: permission failed");
                            return;
                        }
                    }
                    Log.d("tag", "onRequestPermissionsResult: permission granted");
                    mLocationPermissionsGranted = true;
                }
            }
        }
    }
}
EN

回答 1

Stack Overflow用户

发布于 2019-08-15 09:39:12

看起来像是RXJava的作业,那么您可以在成功时继续,或者在失败时显示一些错误。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57507619

复制
相关文章
如何创建、更新和删除SQL 视图
视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。
用户4988376
2021/07/16
1.9K0
java 主线程等待子线程执行完后再执行
示例如下,我们初始化一个CountDownLatch,值为10(子线程个数),然后每次一个子线程执行完后执行一下countDown(),代码示例如下:
IT云清
2019/01/22
4.8K0
java CountDownLatch用法 主线程等待子线程执行完后再执行
示例如下,我们初始化一个CountDownLatch,值为10(子线程个数),然后每次一个子线程执行完后执行一下countDown(),代码示例如下:
IT云清
2022/05/07
1.1K0
Android Studio 更新后Gradle问题
重新安装了Android studio 之后, 启动android studio,打开原来的项目,界面一直停留在:
用户2929716
2018/08/23
1.1K0
Android Studio 更新后Gradle问题
Oracle OWI 等待事件历史视图及相关视图
    Oracle提供的等待事件视图使得我们可以获取指定session以及实例级别等待事件的详细信息,这些视图分别是v$session_wait,v$session_event,以及v$system_event。然而这几个视图对于历史等待事件无能为力。对此,Oracle也提供了历史等待事件视图v$session_wait_history,同时视图v$session_wait_class,v$system_wait_class也提供了基于等待类别的性能分析,下面是基于Oracle 10g对此展开的描述。
Leshami
2018/08/14
5640
android之Retrofit使用
Github地址 Retrofit基于okhttp封装的网络请求框架, 网络请求的工作本质上是 OkHttp 完成,而 retrofit 仅负责网络请求接口的封装。
李小白是一只喵
2021/01/14
7250
MySQL视图更新
昨天在写美团2019秋招笔试题的时候遇到了关于视图是否能更新的问题,突然感觉这个问题之前复习的时候重点关注过,但是却又想不全。今天特地搜了一些资料总结一下。本文主要说明视图的更新限制,如需关于视图的更多知识,参考:MySql视图原理讲解与使用大全
lin_zone
2018/10/10
3.9K0
Android 天气APP(四)搭建MVP框架与使用
现在这样固然符合网络请求的标准,结果也得到了,但是这只是一个接口而已,我们用了这么多代码,那假如这个页面上还有好几个接口要请求访问,岂不是多出了很多的重复代码,这一点并不符合现在Android的现状,所以需要封装OKHttp,通过架构或者框架来完成这一步,前期虽然麻烦一些,但是你一旦用习惯了,就停不下来了,接下来我尽量用人话来讲述这个搭建过程。 为了让你有一个清晰的思路,这里创建一个模块,里面搭建MVP框架。
晨曦_LLW
2020/09/25
1.1K0
Android  天气APP(四)搭建MVP框架与使用
Android Open Mobile API 详解(持续更新)
其中与卡交互时有两个地方需要输入参数: 1.打开逻辑通道时,输入AID; 2.与卡交互时,发送APDU。 其中APDU命令如果具备一些卡的相关知识就可以知道,但是AID不是这样的,AID是开发者与卡上协商后确定的。 (注,现在的SIM卡有JAVA卡和Native卡,并且这两种卡开发不一样)。
胖虎哥
2023/05/10
4900
Android Open Mobile API 详解(持续更新)
Android-Retrofit简介
上一篇文章讲了RxJava,这一篇当然就该讲Retrofit了,参考资料: https://blog.csdn.net/gumufuyun/article/details/83619879
android_薛之涛
2019/08/08
2K0
Java多种方法实现等待所有子线程完成后再继续执行
在现实世界中,我们常常需要等待其它任务完成,才能继续执行下一步。Java实现等待子线程完成再继续执行的方式很多。我们来一一查看一下。
Jensen_97
2023/07/20
6850
Java多种方法实现等待所有子线程完成后再继续执行
Android 天气APP(四)搭建MVP框架与使用
现在这样固然符合网络请求的标准,结果也得到了,但是这只是一个接口而已,我们用了这么多代码,那假如这个页面上还有好几个接口要请求访问,岂不是多出了很多的重复代码,这一点并不符合现在Android的现状,所以需要封装OKHttp,通过架构或者框架来完成这一步,前期虽然麻烦一些,但是你一旦用习惯了,就停不下来了,接下来我尽量用人话来讲述这个搭建过程。 为了让你有一个清晰的思路,这里创建一个模块,里面搭建MVP框架。
晨曦_LLW
2022/05/10
9080
Android 天气APP(四)搭建MVP框架与使用
Android组件化-经典MVP
Android MVP是安卓开发中一个经典的话题,当项目较大、参与的开发人员较多,MVP的优势就体现出来了。
用户2987604
2020/06/15
1K0
Android RxJava/RxAndroid结合Retrofit使用
概述 RxJava是一个在 Java VM 上使用可观测的序列来组成异步的、基于事件的程序的库。更重要的是:使用RxJava在代码逻辑上会非常简洁明了,尤其是在复杂的逻辑上。告别迷之缩进。 RxAnd
非著名程序员
2018/02/02
1.4K0
Android RxJava/RxAndroid结合Retrofit使用
Android MVP+RxJava+Retrofit (2) RxJava+Retrofit
说道RxJava+Retrofit 的组合 大家基本不陌生,先介绍一下Retrofit Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装。说白了真正工作的还是OkHttp 。
全栈程序员站长
2022/06/29
8860
Android MVP+RxJava+Retrofit (2) RxJava+Retrofit
mysql创建索引视图_mysql中创建视图、索引[通俗易懂]
视图中的数据依赖于原来表中的数据,一旦表中数据发生改变,显示在视图中的数据也会发生改变。
全栈程序员站长
2022/09/16
9K0
Android RxJava应用:网络请求出错重连(结合Retrofit)
Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。
Carson.Ho
2022/03/25
1.6K0
Android RxJava应用:网络请求出错重连(结合Retrofit)
Android:RxJava 结合 Retrofit 全面实现 网络请求出错重连
前言 Rxjava,由于其基于事件流的链式调用、逻辑简洁 & 使用简单的特点,深受各大 Android开发者的欢迎。 如果还不了解RxJava,请看文章:Android:这是一篇 清晰 & 易懂的R
Carson.Ho
2019/02/22
1.9K0
Android Jetpack架构组件(九)之Paging
在Android应用开发中,我们经常需要以列表的方式来展示大量的数据,这些数据可能来自网路,也可以来自本地的数据库。为了避免一次性加载大量的数据,对数据进行分页就显得很有必要。分页加载可以根据需要对数据进行按需加载,在不影响用户体验的前提下,提升应用的性能。
xiangzhihong
2021/01/13
3.9K0
点击加载更多

相似问题

等待UI更新后再删除UIActivityIndicator

20

等待Swing完成更新JProgressBar后再继续

25

立即显示子视图/等待视图可见后再继续

32

等待内部指令编译后再调用api函数

10

反应16.13: useState等待状态更新后再呈现

12
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档