web-dev-qa-db-ja.com

コンテキストをAsyncTaskに渡すにはどうすればよいですか?

バックグラウンドタスクが完了したときにToastを実行して、完了したことをユーザーに知らせるだけです。

AsyncTaskの新しいクラスを作成しましたが、このクラス内でgetApplicationContext()を使用できません。

タスクを実行するためにtask.execute(getTempFile(this), getApplicationContext());を使用しています。 getTempFileはFileオブジェクトを返し、コンテキストをContextオブジェクトとして渡そうとしていました。

私のタスククラスには3つの変数AsyncTask<Object, Integer, Integer>したがって、コンテキストは2番目のオブジェクトにあります。ただし、これによりアプリケーションがクラッシュします。

編集

public class LocationActivity extends Activity implements LocationListener {
    protected void handleImage(Bitmap thumbnail){
        PushDataToServer task = new PushDataToServer();
        task.execute(getTempFile(this), getApplicationContext());
    }
}




public class PushDataToServer extends AsyncTask<Object, Integer, Integer> {

    Context context;

    @Override
    protected Integer doInBackground(Object... params) {
        // TODO Auto-generated method stub
        this.context = (Context) params[1];
        File file = (File) params[0];
        return null;
    }

    protected void onPostExecute(String result) {   
         Toast toast = Toast.makeText(this.context, "All done!", Toast.LENGTH_SHORT);
         toast.show();
    }

}
23
dotty

ContextオブジェクトをAsyncTaskのコンストラクターに渡します。

サンプルコード:

public class MyTask extends AsyncTask<?, ? ,?> {
    private Context mContext;

    public MyTask(Context context) {
        mContext = context;
    } 
}

そして、AsyncTaskを構築するとき:

MyTask task = new MyTask(this);
task.execute(...);
78
Wroclai

これをメソッドパラメータとしてではなく、コンストラクタに渡します。そうすれば、ジェネリックパラメータに依存する必要はありません。

2
Nikolay Elenkov
1
Fernando JS

コンテキストが2番目のオブジェクトにあると言いますが、2番目のオブジェクトは整数です。これはあなたの問題でしょうか?また、もう1つの提案は、AsyncTaskクラスをアクティビティのプライベート内部クラスとして配置することです。そうすれば、getApplicationContext()にアクセスできると確信しています。

0
Jack