NullpointerException当我尝试使用另一个类的信息设置EditText
我已经阅读了很多帖子,有几乎相同的问题,但它并没有帮助我解决我的问题,事情是我正在尝试创建一个应用程序不断更新2使用设备的GPS的纬度和经度EditTexts中的信息。在教程中,我看到他们在MainActivity中创建类,所以我尝试做几乎相同的事情,但创建一个新的类文件。当我将信息发送到MainActivity时,它到达EditText,但似乎那些信息不能填充,我不知道为什么...想到这可能是我尝试实现AsynkTask的线程(但我的android技能不高),我有同样的错误...如果有人能帮助我,我真的很高兴!我旁边张贴的代码...NullpointerException当我尝试使用另一个类的信息设置EditText
这是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的这个谢谢!
这里有一些东西。这不是使用Activity
的引用的正确方法。另外,您不能更新UI
中的元素doInBackground()
,因为它需要在UI
上完成。您可以在任何其他AsyncTask
方法中执行此操作。另外,如果你能够使它成为你的Activity
的内部类,那么它将有权访问成员变量及其功能。
See these answers通过对您的AsyncTask
的引用。
And this one on using an interface获取您的AsyncTask
完成时的数据。
接口链接非常有用。 – Raghunandan
你这样做
private MainActivity mainActivity = new MainActivity();
mainActivity.edTLatitud.setText(String.valueOf(location.getLatitude()));
哪项是错误的
你需要使用意图的值传递给其他的活动。为您的第二个活动编辑editText。检索值初始化您的编辑文本并设置值。这是如果你的第二课是一个活动课。
你的第二类是非活动类
public class MyLocationListener implements LocationListener{
正如codeMagic使用界面效果会更好
有在第二类中的接口
在活动类实现接口,然后建议将值设置为editext
或者您可以让asynctask成为活动类的内部类,然后更新在onPostExecute
的editext。
编辑:
您还调用的AsyncTask每次位置改变gpsBackground.execute(location)
。
请你给我一个链接或张贴我的例子使用意图,因为你提到它吗? – Elsanty
@Elsanty你的第二课是非活动课,所以不要打扰意图。使用界面。检查链接codeMagic回答第二个链接 – Raghunandan
@Elsanty你可以让你的asycntask成为你的活动类的内部类,并更新'onPostExecute'中的edittext。 – Raghunandan
这实际上并没有回答你的问题,但行
private MainActivity mainActivity = new MainActivity();
为我弹出一个严重的问题。在Android中,我们从不(AFAIK)以这种方式创建一个Activity
对象。最大的问题是这个MainActivity
是而不是与您的设备上显示的相同。您需要使用对现有MainActivity
的引用。
要做到这一点,至少有两个选项:
声明
MyLocationListener
作为一个内部类的MainActivity
。然后MyLocationListener
可以直接访问MainActivity
的字段。使用参数
MainActivity
将构造函数添加到MyLocationListener
。然后,当您创建一个MyLocationListener
对象时,请将其发送给当前的MainActivity
。
哪里是线MyLocationListener.java的50? –
'私人MainActivity mainActivity =新的MainActivity();'这条线看起来很可疑。手动创建新的“活动”的原因是什么? –
以及我虽然这样我引用MainActivity来使用EditTexts – Elsanty