0

私は経験豊富な AS3 開発者であり、バックエンド用に Java を使用してかなりの作業を行ってきましたが、ネイティブ Android 開発は初めてなので、最初のプロジェクトのいくつかの基本的なタスクで問題が発生しています。

ですから、クラックの 1 つがここで私を助けてくれたり、正しい方向に向けてくれることを願っています. 初投稿なので簡単に自己紹介。;)

当面のタスクは、アプリケーションの起動時にユーザーの郵便番号を取得することです。逆ジオコーディングに AsyncTask を使用してきましたが、一般的には機能しているようです。ただし、ボタンのクリックで ReverseGeocodingTask を呼び出し、そうする数秒前に呼び出した場合のみです。すぐに押すと、機能する場合と機能しない場合があるため、明らかに onCreate メソッドで呼び出すと、アプリもクラッシュします。また、電話でインターネットをオフにするとクラッシュします。私は、ネットワーク プロバイダーの位置情報で十分であり、GPS の精度や追加の権限は必要ないと考えました。

ユーザーが INet をオフにすると、郵便番号が見つからないというメッセージが表示され、手動で入力するオプションが表示されます。

ジオコーディングに渡す currentLocation がまだ見つからず、NullPointerException をスローしていると考えたので、呼び出しの前に確認することでそれを防ごうとしました。しかし、それは実際には役に立たず、とにかく最終バージョンの解決策ではありません.

コードを表示して、何が起こっているのかを理解するのが常に最善であるため、次のようになります。

package com.adix.DroidTest;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.location.*;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import java.io.IOException;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.atomic.AtomicReference;

import static java.util.Locale.getDefault;

public class MyActivity extends Activity implements View.OnClickListener {

    Button getPostCode, confirm;
    TextView tvPostcode;
    LocationManager locationManager;
    Location currentLocation;
    double currentLatitude;
    double currentLongitude;
    private Handler mHandler;
    private static final int UPDATE_ADDRESS = 1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        init();

        locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

        AtomicReference<LocationListener> locationListener = new AtomicReference<LocationListener>(new LocationListener() {
            public void onLocationChanged(Location location) {
                updateLocation(location);
            }

            private void updateLocation(Location location) {
                currentLocation = location;
                currentLatitude = currentLocation.getLatitude();
                currentLongitude = currentLocation.getLongitude();
            }

            public void onStatusChanged(
                    String provider, int status, Bundle extras) {
            }

            public void onProviderEnabled(String provider) {
            }

            public void onProviderDisabled(String provider) {
            }
        });
       locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener.get());
        //getAddress();

        mHandler = new Handler() {
            public void handleMessage(Message msg) {
                switch (msg.what) {
                    case UPDATE_ADDRESS:
                        tvPostcode.setText((String) msg.obj);
                        break;
                }
            }
        };
    }

    private void init() {
        getPostCode = (Button)findViewById(R.id.bGetPostCode);
        confirm = (Button)findViewById(R.id.bConfirm);
        tvPostcode = (TextView)findViewById(R.id.tvPostcode);

        getPostCode.setOnClickListener(this);
        confirm.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        switch (view.getId()){
            case R.id.bGetPostCode:

                currentLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                if(currentLocation != null) {
                    Log.d("TRACE",currentLocation.toString());
                    Toast.makeText(this, "Suche Postleitzahl", Toast.LENGTH_LONG).show();
                    (new ReverseGeocodingTask(this)).execute(new Location[]{currentLocation});
                }

                break;
            case R.id.bConfirm:
                Intent i = new Intent(MyActivity.this, MainMenu.class);
                startActivity(i);
                finish();

        }

    }

    private class ReverseGeocodingTask extends AsyncTask<Location, Void, Void> {

        Context mContext;

        public ReverseGeocodingTask(Context context) {
            super();
            mContext = context;
        }
        @Override
        protected Void doInBackground(Location... locations) {

            try{

                Geocoder gcd = new Geocoder(mContext, Locale.getDefault());
                List<Address> addresses = gcd.getFromLocation(currentLatitude, currentLongitude,100);
                Address address =  addresses.get(0);
                StringBuilder result = new StringBuilder();
                result.append(address.getPostalCode());
               // tvPostcode.setText(result.toString());
                Message.obtain(mHandler, UPDATE_ADDRESS, result.toString()).sendToTarget();
            }
            catch(IOException ex){
                tvPostcode.setText(ex.getMessage().toString());
                Message.obtain(mHandler, UPDATE_ADDRESS, ex.getMessage().toString()).sendToTarget();
            }
            return null;
        }
    }
}
4

1 に答える 1

0

この投稿以来、誰かが私の間違いを見たかどうかを確認するために、これを休ませました。返事がなかったので、今日もう一度やり直しました。そして幸いなことに、最終的には非常に迅速に答えが見つかりました。明らかに、updateLocation の後に onLocationChanged メソッドで ReverseGeocodingTask を実行する必要がありました。

于 2013-02-20T17:31:44.337 に答える