当我尝试使用来自另一个类的信息设置EditText时,NullpointerException

时间:2013-08-22 20:59:00

标签: android android-asynctask gps android-edittext

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

这是 MainActivity

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: at com.apps3d.logixuexapp.MyLocationListener$GPSBackground.doInBackground(MyLocationListener.java:50)
08-22 18:57:40.745      563-572/com.apps3d.logixuexapp W/System.err: at com.apps3d.logixuexapp.MyLocationListener$GPSBackground.doInBackground(MyLocationListener.java:42)
08-22 18:57:40.755      563-572/com.apps3d.logixuexapp W/System.err: at 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: at java.util.concurrent.FutureTask.run(FutureTask.java:138)
08-22 18:57:40.755      563-572/com.apps3d.logixuexapp W/System.err: at 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 个答案:

答案 0 :(得分:3)

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

See these answers传递对AsyncTask的引用。

And this one on using an interfaceAsyncTask完成后获取数据。

答案 1 :(得分:2)

你这样做

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

哪个错了

您需要使用intent将值传递给其他活动。为第二个活动安装editText。检索值初始化您的edittext并设置值。如果你的第二堂课是活动课,那就是这样。

你的第二堂课是非活动课

   public class MyLocationListener implements LocationListener{

正如codeMagic建议使用接口会更好

在第二课中有一个界面

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

或者您可以将asynctask作为活动类的内部类,然后在onPostExecute中更新editext。

编辑:

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

答案 2 :(得分:1)

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

private MainActivity mainActivity = new MainActivity();

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

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

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

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

答案 3 :(得分:0)

您可以将活动的引用传递给AsynchTask,而不是使用edittext