私の呼び出し活動:
_public class Hello extends Activity {
public void onCreate(Bundle savedInstanceState) {
MyTask mt = new MyTask(this);
mt.execute();
}
_
現在MyTask(外部クラス):
_public class MyTask extends AsyncTask<Void, Void, Void> {
private Context mContext;
public MyTask(Context context) {
mContext = context;
}
//doinbackground, etc
protected void onPostExecute() {
mContext.finish();
}
_
上記のmContext.finish()
を削除すると、他のものは期待どおりに機能します。
しかし、mContext.finish()
を呼び出すと、エラーが発生します:The method finish() is undefined for the type Context
(mContextを記述したときにEclipseはfinish()を表示しません。 finish()を間違って使用しています。)
Hello
がタスクを完了した後、呼び出しアクティビティMyTask
を終了するには何をする必要がありますか
_((Activity)mContext).finish();
_
Context
をActivity
にキャストし、そのfinish()
メソッドを呼び出す正しい方法です。 Activity
からAsyncTask
を終了したい理由がわかりませんが
Context.finish()を呼び出す代わりにできることは、次のようなコールバックインターフェイスを実行してみませんか。
public interface TaskCallback{
void done();
}
次に、これをアクティビティに実装します
public Hello extends Activity implements TaskCallback{
.....BUNCH OF ACTIVITY CODE.....
public void onCreate(Bundle savedInstanceState) {
MyTask mt = new MyTask(this);
mt.execute();
}
public void done() {
finish();
}
}
そして、パラメータとしてContextを持つ代わりに、TaskCallbackがあります
public class MyTask extends AsyncTask<Void, Void, Void> {
private TaskCallback mCallback;
public MyTask(TaskCallback callback) {
mCallback = callback;
}
//doinbackground, etc
protected void onPostExecute() {
mCallback.done();
}
これで、各実装をカスタマイズするための柔軟性が高まります。
私は同じ状況になりました、そして私は次のようにします:
public class MyTask extends AsyncTask<Void, Void, Void> {
private Activity mActivity;
private Context mContext;
public MyTask(Activity activity) {
mActivity = activity;
mContext = mActivity.getApplicationContext();
}
//doinbackground, etc
protected void onPostExecute() {
mActivity.finish();
}
お役に立てば幸いです:)
次のように、アクティビティクラスでメソッドを定義します。
public void FinishAfterAsyncTask()
{
this.finish();
}
そして、このメソッドをOnPostExecute
クラスのAsynTask
メソッドから呼び出します。
パブリックAsyncTaskから拡張された新しいプライベートAsyncTaskを作成できます。
このプライベートAsyncTaskでは、Activityのものにアクセスでき、onPostExecuteメソッドをオーバーライドして終了できます。
あなたの本当にAsyncTask
public class MyPublicAsyncTask extends AsyncTask<Void, Void, Void> {
Context context;
public GetHorariosAsyncTask(Context ctx){
context = ctx;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
// prepare yourself for an async work
}
@Override
protected Void doInBackground(Void... params) {
// Do yout cool async stuff
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
// you're finish, let's tell to user
}
}
プライベートAsyncTaskを使用したアクティビティ
public class MyActivity extends Activity {
Activity mAct;
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
mAct = this;
}
private class MyPrivateAsyncTask extends MyPublicAsyncTask {
public MyPrivateAsyncTask(Context ctx) {
super(ctx);
// TODO Auto-generated constructor stub
}
@Override
protected void onPostExecute(Void result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
// our async task is completed! let's take care of this activity
mAct.finish();
}
}
}