19

そこで、AsyncTask クラスで Android を使用して、初めてのマルチスレッド アプリケーションを作成しています。これを使用して 2 番目のスレッドで Geocoder を起動し、onPostExecute で UI を更新しようとしていますが、適切なコンテキストで問題が発生し続けています。

メイン スレッドで Contexts を使用するのに苦労しましたが、Context とは何か、またはバックグラウンド スレッドで使用する方法が正確にはわかりません。また、良い例も見つかりませんでした。何か助けはありますか?これが私がやろうとしていることの抜粋です:

public class GeoCode extends AsyncTask<GeoThread, Void, GeoThread> {
  @Override
  protected GeoThread doInBackground(GeoThread... i) {
    List<Address> addresses = null;
    Geocoder geoCode = null; 
    geoCode = new Geocoder(null); //Expects at minimum Geocoder(Context context);
    addresses = geoCode.getFromLocation(GoldenHour.lat, GoldenHour.lng, 1);
  }
}

Contextが不適切なため、6行目で失敗し続けます。

4

5 に答える 5

18

@Eugene van der Merwe

次のコードは私のために機能します:)->

public class ApplicationLauncher extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.applicationlauncher);

    LoadApplication loadApplication = new LoadApplication(this);
    loadApplication.execute(null);
}

private class LoadApplication extends AsyncTask {

    Context context;
    ProgressDialog waitSpinner;
    ConfigurationContainer configuration = ConfigurationContainer.getInstance();

    public LoadApplication(Context context) {
        this.context = context;
        waitSpinner = new ProgressDialog(this.context);
    }

    @Override
    protected Object doInBackground(Object... args) {
        publishProgress(null);
        //Parsing some stuff - not relevant
        configuration.initialize(context);
        return null;
    }

    @Override
    protected void onProgressUpdate(Object... values) {
        super.onProgressUpdate(values);
        // Only purpose of this method is to show our wait spinner, we dont
        // (and can't) show detailed progress updates
        waitSpinner = ProgressDialog.show(context, "Please Wait ...", "Initializing the application ...", true);
    }

    @Override
    protected void onPostExecute(Object result) {
        super.onPostExecute(result);
        waitSpinner.cancel();
    }
}
}

乾杯、

Ready4Android

于 2011-04-27T20:50:56.887 に答える
4

コンテキストは、アプリケーションランタイム環境へのアクセスを提供するオブジェクトです。ほとんどの場合、リソース、ビュー、インフラストラクチャクラスなど、Android環境からオブジェクトを取得する必要がある場合は、コンテキストを手に入れる必要があります。

Activityクラスにいる場合、Contextインスタンスを取得するのは非常に簡単です。つまり、Activity自体はContextのサブクラスであるため、必要なのは「this」キーワードを使用して現在のコンテキストを指すことだけです。

Contextを必要とする可能性のあるコードを作成する場合は常に、親アクティビティからContextオブジェクトを渡すように注意する必要があります。あなたの例の場合、入力引数としてContextを受け入れる明示的なコンストラクターを追加できます。

于 2010-02-23T20:00:46.027 に答える
2

私はさらに調査を行い、誰かがそれをスレッドに渡すことを提案しました (なぜ私がそれを考えなかったのかわかりません)。引数を介して Geocoder スレッドに渡したところ、そのように機能しました。

于 2009-12-16T06:53:18.987 に答える
1

AsyncTask から UI を更新する際の問題は、現在のアクティビティ コンテキストが必要なことです。ただし、向きが変わるたびにコンテキストが破棄され、再作成されます。

あなたの質問に対する良い答えは次のとおりです: Android AsyncTask context behavior

于 2010-10-05T17:19:16.233 に答える
0

パラメータを使用しているように見えない場合。それを使用して、Conetxt を渡すことができます。

public class GeoCode extends AsyncTask<Context, Void, GeoThread> {
  @Override
  protected GeoThread doInBackground(Context... params) {
    List<Address> addresses = null;
    Geocoder geoCode = null; 
    geoCode = new Geocoder(params[0]); //Expects at minimum Geocoder(Context context);
    addresses = geoCode.getFromLocation(GoldenHour.lat, GoldenHour.lng, 1);
  }
}

次に、アクティビティ内から:

GeoCode myGeoCode = new GeoCode();
myGeoCode.execute(this);
于 2014-05-27T18:33:25.573 に答える