1

我已经阅读了很多几乎相同问题的帖子,但它对我的问题没有帮助,问题是我正在尝试创建一个应用程序来不断更新 2 EditTexts 中的信息,用于纬度和经度,使用设备的 GPS。在教程中,我看到他们在 MainActivity 中创建类,所以我尝试做几乎相同的事情,但创建一个新的类文件。当我将信息发送到 MainActivity 时,它会到达 EditText 但似乎那些无法填充我不知道为什么的信息......认为这可能是我尝试实现 AsynkTask 的线程(但我的 android 技能不高),我也有同样的错误......如果有人可以帮助我,我真的会非常棒!我接下来发布代码...

这是主要活动

public class MainActivity extends Activity {

    public EditText edTLatitud;
    public EditText edTLongitud;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        edTLatitud = (EditText)this.findViewById(R.id.edTxtLatitud);
        edTLongitud = (EditText)this.findViewById(R.id.edTxtLongitud);
        ConfigGps();
    }

    private void ConfigGps()
    {
        LocationManager mLocationManager;
        LocationListener mLocationListener;

        mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
        mLocationListener = new MyLocationListener();
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,5000, 1, mLocationListener);
    }

这是新的文件类

public class MyLocationListener implements LocationListener{

    private MainActivity mainActivity = new MainActivity();
    private GPSBackground gpsBackground = new GPSBackground();
    private String Latitud,Longitud;

    @Override
    public void onLocationChanged(Location location) {

        gpsBackground.execute(location);
    }

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

    }

    @Override
    public void onProviderEnabled(String provider) {

    }

    @Override
    public void onProviderDisabled(String provider) {

    }

    private class GPSBackground extends AsyncTask<Location, Void,Void>
    {

        @Override
        protected Void doInBackground(Location... params) {
            Location location = params[0];

            try{
                mainActivity.edTLatitud.setText(String.valueOf(location.getLatitude()));
                mainActivity.edTLongitud.setText(String.valueOf(location.getLongitude()));
            }
            catch (Exception e)
            {
                e.printStackTrace();
            }

            return null;
        }
    }
}

我发现的错误是这个:

563-572/com.apps3d.logixuexapp W/System.err:java.lang.NullPointerException
08-22 18:57:40.745 563-572/com.apps3d.logixuexapp W/System.err: 在 com.apps3d.logixuexapp.MyLocationListener$GPSBackground.doInBackground(MyLocationListener.java:50)
08-22 18:57:40.745 563-572/com.apps3d.logixuexapp W/System.err: 在 com.apps3d.logixuexapp.MyLocationListener$GPSBackground.doInBackground(MyLocationListener.java:42)
08-22 18:57:40.755 563-572/com.apps3d.logixuexapp W/System.err: 在 android.os.AsyncTask$2.call(AsyncTask.java:185)
08-22 18:57:40.755 563-572/com.apps3d.logixuexapp W/System.err: at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
08-22 18:57:40.755 563-572/com.apps3d.logixuexapp W/System.err: 在 java.util.concurrent.FutureTask.run(FutureTask.java:138)
08-22 18:57:40.755 563-572/com.apps3d.logixuexapp W/System.err: 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
08-22 18:57:40.755 563-572/com.apps3d.logixuexapp W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
08-22 18:57:40.755 563-572/com.apps3d.logixuexapp W/System.err: at java.lang.Thread.run(Thread.java:1019)

好吧,如果我做错了什么,请帮帮我,我是 android 开发的新手 jejej 谢谢!

4

4 回答 4

3

这里有几件事。这不是使用Activity. 此外,您无法更新UI元素,doInBackground()因为它需要在UI. 您可以通过任何其他AsyncTask方法执行此操作。此外,如果您能够使其成为您的内部类,Activity那么它将可以访问成员变量及其函数。

有关将引用传递给您的AsyncTask.

这个是关于在你完成后使用接口获取数据的AsyncTask

于 2013-08-22T21:04:57.110 回答
2

你正在这样做

    private MainActivity mainActivity = new MainActivity();
    mainActivity.edTLatitud.setText(String.valueOf(location.getLatitude()));

哪个是错的

您需要使用意图将值传递给其他活动。为您的第二个活动设置editText。检索值初始化您的编辑文本并设置值。这是如果您的第二堂课是活动课。

你的第二节课是非活动课

   public class MyLocationListener implements LocationListener{

正如codeMagic所建议的那样,使用界面会更好

在二等舱有一个接口

在您的活动类中实现接口,然后将值设置为 editext

或者您可以将 asynctask 作为您的活动类的内部类,然后在onPostExecute.

编辑:

每次更改位置时,您也会调用 asynctask gpsBackground.execute(location)

于 2013-08-22T21:04:11.753 回答
1

这实际上并没有回答你的问题,而是这条线

private MainActivity mainActivity = new MainActivity();

像我一样弹出一个严重的问题。在 Android 中,我们从不(AFAIK)以这种方式创建Activity对象。最大的问题是,这MainActivity您设备上显示的不同。您需要使用对现有的引用MainActivity

为此,您至少有两个选择:

  1. 声明MyLocationListener为 的内部类MainActivity。然后MyLocationListener可以访问的字段MainActivity

  2. MyLocationListener使用参数添加构造MainActivity函数。然后,当您创建一个MyLocationListener对象时,向它发送一个对当前MainActivity.

于 2013-08-22T21:07:48.190 回答
0

您可以将您的活动的引用传递给 AsynchTask,然后您可以使用 edittext

于 2013-08-22T21:07:51.530 回答