2013-08-22 4 views
1

거의 같은 질문을 가진 게시물을 많이 읽었지만 내 문제를 해결하지 못했습니다. 문제는 작성하려고하는 것입니다. 장치의 GPS를 사용하여 위도와 경도에 대한 2 개의 편집 문구에있는 정보를 지속적으로 업데이트하는 앱입니다. 튜토리얼에서 MainActivity 내부에서 클래스를 생성하는 것을 보았으므로 거의 동일하지만 새로운 클래스 파일을 만들려고합니다. MainActivity에 정보를 보내면 EditText에 도달하지만 그 정보로 채울 수없는 것 같습니다. 이유는 모르겠지만 ... AsynkTask를 구현하려고하는 스레드가 될 수 있다고 생각합니다 (그러나 내 안드로이드 기술 높은되지 않습니다) 그리고 나는 같은 오류가 발생했습니다 ... 어떤 사람이 나를 도울 수 있다면 정말 whful 수 Whfulfull! 내가 잡을 오류이 하나 옆에 코드 ...다른 클래스의 정보로 EditText를 설정하려고 할 때 NullpointerException이 발생했습니다.

이것은 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) 

글쎄 나는 잘못한 일을하고있다. 나에게 손을 줘라, 나는 안드로이드 개발 jejej의 이것에 새로운 것이다!

+0

을 사용할 수있는 것보다? –

+0

'private MainActivity mainActivity = new MainActivity();'이 줄은 의심스러워 보입니다. 수동으로 새로운 '활동'을 만드는 이유는 무엇입니까? –

+0

글쎄 내가 그런 식으로 내가 EditTexts를 사용하기 위해 MainActivity를 참조하고 있었다. – Elsanty

답변

3

여기 몇 가지. 이것은 Activity의 참조를 사용하는 올바른 방법이 아닙니다. 또한 UI 요소는 UI에서 수행해야하므로 요소를 doInBackground()에 업데이트 할 수 없습니다. 다른 AsyncTask 방법으로이 작업을 수행 할 수 있습니다. 또한, 내부 클래스를 Activity으로 만들 수 있다면 멤버 변수와 그 함수에 액세스 할 수 있습니다.

See these answersAsyncTask에 대한 참조를 전달합니다.

And this one on using an interfaceAsyncTask이 완료되면 데이터를 가져올 수 있습니다.

+1

인터페이스 링크는 매우 유용합니다. – Raghunandan

2

당신은

잘못이

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

당신이 의도를 사용하여 다른 활동에 값을 전달해야하고 있습니다. 두 번째 활동을 위해 editText를 사용하십시오. 값을 가져 와서 편집 텍스트를 초기화하고 값을 설정하십시오. 두 번째 클래스가 활동 클래스 인 경우입니다.

두 번째 클래스는

다음 활동 클래스의 인터페이스를 구현하고

두 번째 클래스의 인터페이스가 더 좋을 것이다 인터페이스를 사용 codeMagic 제안으로 비 활동 클래스

public class MyLocationListener implements LocationListener{ 

입니다 값을 editext로 설정하십시오.

또는 asynctask를 활동 클래스의 내부 클래스로 만든 다음 업데이트 할 수 있습니다 editext in onPostExecute.

편집 : 당신은 또한 AsyncTask를 호출 할

마다 위치가 gpsBackground.execute(location)을 변경됩니다.

+0

나에게 링크를 보내 주시거나 내게 의도를 사용하는 예를 게시 해 주시겠습니까? – Elsanty

+0

@Elsanty 두 번째 수업은 비 활동 수업이므로 의도를 고집하지 마십시오. 인터페이스를 사용하십시오. codeMagic 링크를 확인하십시오. – Raghunandan

+0

@Elsanty asycntask를 액티비티 클래스의 내부 클래스로 만들고'onPostExecute'에서 edittext를 업데이트 할 수 있습니다. – Raghunandan

1
이 실제로 귀하의 질문에 대답하지 않는

하지만 라인

private MainActivity mainActivity = new MainActivity(); 

심각한 문제로 나에게로 튀어 나옵니다. Android에서는 결코 AFAIK가 Activity 개체를 이러한 방식으로 생성하지 않습니다. 가장 큰 문제는이 MainActivity이 아니고이 기기에 표시된 것과 동일하다는 것입니다. 대신 기존 MainActivity에 대한 참조를 사용해야합니다.

  1. MainActivity의 내부 클래스로서 MyLocationListener를 선언 :

    당신은 적어도 두 가지 옵션이 있습니다,이 작업을 수행합니다. 그런 다음 MyLocationListenerMainActivity 필드에 직접 액세스 할 수 있습니다.

  2. MainActivity 매개 변수를 사용하여 MyLocationListener에 생성자를 추가하십시오. 그런 다음 MyLocationListener 개체를 만들 때 현재 MainActivity에 대한 참조를 보내십시오.

+0

어떻게 그 참조를 만들 수 있습니까? – Elsanty

+0

@Elsanty 제 편집의 제안 사항을보십시오. –

+0

MyLocationListener를 MainActivity의 내부 클래스로 처음 만들면 작동하지만,이 클래스의 프로 그래밍이 조직되지 않아서 새로운 클래스를 만드는 것이 더 좋다고 말하는 정보를 읽는 중 ...다른 것은, 어떻게 MainActivity를 참조하는 생성자를 만들 수 있습니까? – Elsanty

0

당신은 AsynchTask에 활동의 기준을 통과 할 수 있으며 라인 MyLocationListener.java의 50 인 글고

+0

어떻게 이것을 수행 할 수 있습니까 ?? – Elsanty

관련 문제