使用 locationListener 切换到加载器

KinectDeveloper23

我正在学习 Udacity Android Basics 课程,并且正在尝试更改我的应用程序以使用 Loader 而不是 AsyncTask。我的应用程序使用 locationListener 生成一个自定义 URL,然后将其传递给加载程序,加载程序调用 ChargePointLoader 类,该类启动 HTTP 请求并返回 ChargePoints 列表,该列表应在加载后填充适配器。

但是,我的屏幕上什么也没有出现。我的加载程序的顺序是错误的还是 locationListener 干扰了加载程序?谢谢你的帮助

这是旧异步项目的链接:https : //github.com/Kovah101/ChargeMyCarBareBones/blob/master/app/src/main/java/com/example/android/chargemycar/MainActivity.java

这是我的主要活动

public class MainActivity extends AppCompatActivity implements LoaderCallbacks<List<ChargePoint>> {

public static final String LOG_TAG = MainActivity.class.getName();

public static double myLat;
public static double myLong;

private static  String ChargePoint_REQUEST_URL = "http://chargepoints.dft.gov.uk/api/retrieve/registry/postcode/SW15+5QS/dist/7/format/json/limit/10";

private ChargePointAdapter adapter;

private LocationManager locationManager;
private LocationListener locationListener;

private static final int CHARGEPOINT_LOADER_ID = 1;

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

    // Find a reference to the {@link ListView} in the layout
   final ListView chargePointListView = (ListView) findViewById(R.id.list);

    // Create a ChargingPointAdapter, whose data source is a list of ChargePoints, which creates listview items for each item
    adapter = new ChargePointAdapter(this, new ArrayList<ChargePoint>());

    //possible error with order of loaders or inside listener
    final LoaderManager loaderManager = getLoaderManager();

    locationManager = (LocationManager) this.getSystemService(LOCATION_SERVICE);
    locationListener = new LocationListener() {
        @Override
        public void onLocationChanged(Location location) {
            //set lat & long variables
            myLat = location.getLatitude();
            myLong = location.getLongitude();
            String myLatString = Double.toString(myLat);
            String myLongString = Double.toString(myLong);

            //test with toast
            Context context = getApplicationContext();
            CharSequence text = " my latitude=" +myLatString +"\nmy longitude=" +myLongString ;
            int duration = Toast.LENGTH_LONG;
            Toast toast = Toast.makeText(context, text, duration);
            toast.show();

            //create request URL using live location
            ChargePoint_REQUEST_URL = "http://chargepoints.dft.gov.uk/api/retrieve/registry/lat/" +myLat + "/long/" +myLong +"/dist/10/format/json/limit/10";

            // Set the adapter on the {@link ListView}
            // so the list can be populated in the user interface
            chargePointListView.setAdapter(adapter);


            loaderManager.initLoader(CHARGEPOINT_LOADER_ID, null, MainActivity.this );

        }

        @Override
        public void onStatusChanged(String provider, int status, Bundle extras) {
        }

        @Override
        public void onProviderEnabled(String provider) {
        }

        @Override
        public void onProviderDisabled(String provider) {
        }
    };


    if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, new String[] {Manifest.permission.ACCESS_FINE_LOCATION}, 1);
    }else{
        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 100, locationListener);
        //time in milliseconds
        //distance in meters
    }

    // On click take to maps
    chargePointListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String myLatString = Double.toString(myLat);
            String myLongString = Double.toString(myLong);

            ChargePoint currentChargePoint = (ChargePoint) chargePointListView.getItemAtPosition(position);
            double destinationLatitude = currentChargePoint.getLatitude();
            double destinationLongitude = currentChargePoint.getLongitude();
            String destLatString = Double.toString(destinationLatitude);
            String destLongString = Double.toString(destinationLongitude);


            //create uri for map intent
            String url = "http://maps.google.com/maps?saddr="+myLatString+","+myLongString+"&daddr="+destLatString+","+destLongString+"&travelmode=driving";
            Intent mapIntent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(url));
                mapIntent.setPackage("com.google.android.apps.maps");
                if (mapIntent.resolveActivity(getPackageManager()) != null) {
                    startActivity(mapIntent);
                }
        }
    });


}

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);

    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED){
        if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)== PackageManager.PERMISSION_GRANTED){
            locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 500, 25, locationListener);
            //time in ms, distance in meters
        }
    }
}

@Override
public Loader<List<ChargePoint>> onCreateLoader(int i, Bundle bundle) {
    return new ChargePointLoader(this, ChargePoint_REQUEST_URL);
}

@Override
public void onLoadFinished(Loader<List<ChargePoint>> loader, List<ChargePoint> chargePoints) {
    // Clear the adapter of previous data
    adapter.clear();
    //check for null charge point list, return early if that is the case, if there is a valid list then add to the adapter
    if (chargePoints != null && !chargePoints.isEmpty()){
        adapter.addAll(chargePoints);
    }
}

@Override
public void onLoaderReset(Loader<List<ChargePoint>> loader) {
    // TODO: Loader reset, so we can clear out our existing data.
    adapter.clear();
}

}
显示年轻的索因卡

现在不推荐使用加载器,将 Android 架构组件(LiveData 和 ViewModel)与旧的 AsyncTask 一起使用。它比装载机更有效、更快、更清洁。它还使您的 AsyncTask 具有生命周期意识。生命周期感知从某种意义上说,无论您调用 onCreate() 多少次,您的网络请求都不会再次发出,因为它会自动缓存下载的数据。配置更改不会影响您的应用。有关将 AsyncTask 与 LiveData 和 ViewModel 结合使用的更多信息,请访问https://medium.com/androiddevelopers/lifecycle-aware-data-loading-with-android-architecture-components-f95484159de4

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

GPS无法使用LocationManager / LocationListener开启

来自分类Dev

使用wxPython将窗口小部件从左拆分器切换到右拆分器

来自分类Dev

使用perlbrew切换到系统Perl

来自分类Dev

使用SnapSvg切换到触摸事件

来自分类Dev

如何使用Intent切换到Activity?

来自分类Dev

如何使用ID切换到iframe

来自分类Dev

使用硒/量角器Javascript切换到新窗口

来自分类Dev

使用微调器切换到另一个活动

来自分类Dev

使用单元格中的按钮切换到详细视图控制器

来自分类Dev

当前线程与分派器不关联。触发渲染时,使用InvokeAsync()将执行切换到分派器

来自分类Dev

jQuery使用条形码阅读器切换到下一个字段

来自分类Dev

如何使用jhipster-registry动态将请求流量从旧服务器实例切换到新实例?

来自分类Dev

使用Nightwatch.js切换到框架

来自分类Dev

使用Flask SQLAlchemy从SQLite切换到MySQL

来自分类Dev

使用Segues将UINavigationViewController切换到UITabBarController

来自分类Dev

无法在Linux中使用fcntl切换到阻止模式

来自分类Dev

切换到使用rdiff-backup备份/而不是rsync?

来自分类Dev

使用C#在Selenium中切换到()框架

来自分类Dev

sbt无法切换到使用ProjectRef从github导入的项目

来自分类Dev

查找使用SQL切换到其就医地点的客户

来自分类Dev

使用Selenium切换到顶级框架

来自分类Dev

Emacs:使用多步骤功能切换到特定窗口

来自分类Dev

如何使用Selenium和python切换到iframe?

来自分类Dev

从ubuntu切换到kubuntu。使用什么应用程序?

来自分类Dev

切换到使用rdiff-backup备份/而不是rsync?

来自分类Dev

如何使用NDIS切换到监视模式?

来自分类Dev

使用UINavigationController切换到任意视图

来自分类Dev

使用C#在Selenium中切换到()框架

来自分类Dev

使用Nightwatch.js切换到框架

Related 相关文章

  1. 1

    GPS无法使用LocationManager / LocationListener开启

  2. 2

    使用wxPython将窗口小部件从左拆分器切换到右拆分器

  3. 3

    使用perlbrew切换到系统Perl

  4. 4

    使用SnapSvg切换到触摸事件

  5. 5

    如何使用Intent切换到Activity?

  6. 6

    如何使用ID切换到iframe

  7. 7

    使用硒/量角器Javascript切换到新窗口

  8. 8

    使用微调器切换到另一个活动

  9. 9

    使用单元格中的按钮切换到详细视图控制器

  10. 10

    当前线程与分派器不关联。触发渲染时,使用InvokeAsync()将执行切换到分派器

  11. 11

    jQuery使用条形码阅读器切换到下一个字段

  12. 12

    如何使用jhipster-registry动态将请求流量从旧服务器实例切换到新实例?

  13. 13

    使用Nightwatch.js切换到框架

  14. 14

    使用Flask SQLAlchemy从SQLite切换到MySQL

  15. 15

    使用Segues将UINavigationViewController切换到UITabBarController

  16. 16

    无法在Linux中使用fcntl切换到阻止模式

  17. 17

    切换到使用rdiff-backup备份/而不是rsync?

  18. 18

    使用C#在Selenium中切换到()框架

  19. 19

    sbt无法切换到使用ProjectRef从github导入的项目

  20. 20

    查找使用SQL切换到其就医地点的客户

  21. 21

    使用Selenium切换到顶级框架

  22. 22

    Emacs:使用多步骤功能切换到特定窗口

  23. 23

    如何使用Selenium和python切换到iframe?

  24. 24

    从ubuntu切换到kubuntu。使用什么应用程序?

  25. 25

    切换到使用rdiff-backup备份/而不是rsync?

  26. 26

    如何使用NDIS切换到监视模式?

  27. 27

    使用UINavigationController切换到任意视图

  28. 28

    使用C#在Selenium中切换到()框架

  29. 29

    使用Nightwatch.js切换到框架

热门标签

归档