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的这个谢谢!

+0

哪里是线MyLocationListener.java的50? –

+0

'私人MainActivity mainActivity =新的MainActivity();'这条线看起来很可疑。手动创建新的“活动”的原因是什么? –

+0

以及我虽然这样我引用MainActivity来使用EditTexts – Elsanty

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

See these answers通过对您的AsyncTask的引用。

And this one on using an interface获取您的AsyncTask完成时的数据。

+1

接口链接非常有用。 – 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)

+0

请你给我一个链接或张贴我的例子使用意图,因为你提到它吗? – Elsanty

+0

@Elsanty你的第二课是非活动课,所以不要打扰意图。使用界面。检查链接codeMagic回答第二个链接 – Raghunandan

+0

@Elsanty你可以让你的asycntask成为你的活动类的内部类,并更新'onPostExecute'中的edittext。 – Raghunandan

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

private MainActivity mainActivity = new MainActivity(); 

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

要做到这一点,至少有两个选项:

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

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

+0

如何创建该参考? – Elsanty

+0

@Elsanty查看我编辑中的建议。 –

+0

我也创建了第一次MyLocationListener作为MainActivity的内部类,它的工作原理是,但读取一些信息,他们说这个类的pr programation没有组织,所以创建新的类更好...其他的事情,我如何创建一个构造函数来引用MainActivity? – Elsanty

你可以通过你的活动到AsynchTask的参考和比你可以使用的EditText

+0

我该如何执行此操作? – Elsanty