1

ほとんど同じ質問をした多くの投稿を読みましたが、それは私の問題を解決するのに役立ちません。問題は、緯度と経度の 2 つの EditTexts の情報を常に更新するアプリを作成しようとしていることです。デバイスの 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: com.apps3d.logixuexapp.MyLocationListener$GPSBackground.doInBackground (MyLocationListener.java:50) で
08-22 18:57:40.745 563-572/com.apps3d.logixuexapp W/System.err: com.apps3d.logixuexapp.MyLocationListener$GPSBackground.doInBackground (MyLocationListener.java:42) で
08-22 18:57:40.755 563-572/com.apps3d.logixuexapp W/System.err: android.os.AsyncTask$2.call(AsyncTask.java:185)
08-22 18:57:40.755 563-572/com.apps3d.logixuexapp W/System.err: java.util.concurrent.FutureTask$Sync.innerRun (FutureTask.java:306) で
08-22 18:57:40.755 563-572/com.apps3d.logixuexapp W/System.err: java.util.concurrent.FutureTask.run (FutureTask.java:138) で
08-22 18:57:40.755 563-572/com.apps3d.logixuexapp W/System.err: java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1088) で
08-22 18:57:40.755 563-572/com.apps3d.logixuexapp W/System.err: java.util.concurrent.ThreadPoolExecutor$Worker.run (ThreadPoolExecutor.java:581) で
08-22 18:57:40.755 563-572/com.apps3d.logixuexapp W/System.err: java.lang.Thread.run (Thread.java:1019) で

私が何か間違ったことをしているなら、私に手を貸してください、私はアンドロイド開発jejejのこれについては初めてですありがとう!!

4

4 に答える 4

3

ここでいくつかのこと。これは、 の参照を使用する正しい方法ではありませんActivity。また、で行う必要があるため、 のUI要素を更新することはできません。これは、他の方法で行うことができます。また、それを内部クラスにすることができれば、メンバー変数とその関数にアクセスできます。doInBackground()UIAsyncTaskActivity

あなたのへの参照を渡すには、これらの回答AsyncTaskを参照してください。

そして、これは、インターフェースを使用してデータを取得する方法に関するものAsyncTaskです。

于 2013-08-22T21:04:57.110 に答える
1

これは実際にはあなたの質問には答えませんが、行

private MainActivity mainActivity = new MainActivity();

深刻な問題として私のように飛び出します。Android では、(AFAIK)Activityこの方法でオブジェクトを作成することはありません。最大の問題は、これがデバイスに表示されているものと同じでMainActivityないことです。MainActivity代わりに既存への参照を使用する必要があります。

これを行うには、少なくとも 2 つのオプションがあります。

  1. MyLocationListenerの内部クラスとして宣言しMainActivityます。次にMyLocationListener、のフィールドにMainActivity直接アクセスできます。

  2. MyLocationListenerパラメータを使用してコンストラクタを追加しMainActivityます。次に、MyLocationListenerオブジェクトを作成するときに、現在の への参照を送信しますMainActivity

于 2013-08-22T21:07:48.190 に答える
0

アクティビティの参照を AsynchTask に渡すことができ、edittext を使用できます

于 2013-08-22T21:07:51.530 に答える