问题
I have the following implementation of AsyncTask
, allowing multiple AsyncTask
s to run concurrently:
public abstract class MyAsyncTask<Params, Progress, Result> extends AsyncTask<Params, Progress, Result> {
public AsyncTask<Params, Progress, Result> executeCompat(Params... params) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
return executeOnExecutor(THREAD_POOL_EXECUTOR, params);
} else {
return execute(params);
}
}
}
Now to avoid confusion and accidental use of the normal AsyncTask
, I would like to block access from my code to:
- The
AsyncTask
class, onlyMyAsyncTask
should be used. - The
execute()
function inMyAsyncTask
.
Is it possible to do this?
回答1:
My idea of doing this would be a bit different. Instead of extending the AsyncTask
class, you can create a method that takes as a parameter the AsyncTask
you want to use. Here is an example:
public void executeAsyncTask(AsyncTask asyncTask) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
asyncTask.executeOnExecutor(THREAD_POOL_EXECUTOR, params);
} else {
asyncTask.execute(params);
}
}
With this you just need to instantiate the AsyncTask you want to use without worrying about the problems you mentioned since you will be extending the Android's
AsyncTask
class having overriden the execute
method the way you want. So lets say that you have defined an AsyncTask
named customAsyncTask
, to execute it you just call executeAsyncTask(new customAsyncTask(your_params));
You can define the above method in a static
class (making the method also static
) for easier access.
Hope that helps:)
回答2:
Do not import AsyncTask
and only import your MyAsyncTask
class. That way your class is the only available option.
I suppose you could overwrite the AsyncTask method in your main file. You must have a new class file for your MyAsyncTask, however, or it will not inherit it correctly.
来源:https://stackoverflow.com/questions/11229734/disable-use-of-asynctask-using-custom-asynctask