我已经阅读了很多帖子,这些帖子几乎有同样的问题,但它对我的问题没有帮助,问题是我正在尝试创建一个应用程序,以便不断更新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谢谢!!
答案 0 :(得分:3)
这里有几件事。这不是使用Activity
引用的正确方法。此外,您无法更新UI
中的doInBackground()
元素,因为需要在UI
上完成。您可以使用任何其他AsyncTask
方法执行此操作。此外,如果您能够使其成为Activity
的内部类,那么它将可以访问成员变量及其函数。
See these answers传递对AsyncTask
的引用。
And this one on using an interface在AsyncTask
完成后获取数据。
答案 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
的引用。
为此,您至少有两个选择:
将MyLocationListener
声明为MainActivity
的内部类。然后,MyLocationListener
可以直接访问MainActivity
字段。
使用MyLocationListener
参数向MainActivity
添加构造函数。然后,当您创建MyLocationListener
对象时,请向其发送对当前MainActivity
的引用。
答案 3 :(得分:0)
您可以将活动的引用传递给AsynchTask,而不是使用edittext