Java Android通用异步任务类
我看到了这个答案: 但这不是我要问的,因为我的调用类有多个对Java Android通用异步任务类,java,android,android-asynctask,Java,Android,Android Asynctask,我看到了这个答案: 但这不是我要问的,因为我的调用类有多个对AsyncTask的调用 我想创建一个通用的AsyncTask类,它将接受URL并从给定的URL下载内容,然后返回下载的内容 例如: public class MyAsyncTask extends AsyncTask<String, Void, String>{ ProgressDialog dialog; protected void onPreExecute() { super.on
AsyncTask
的调用
我想创建一个通用的AsyncTask
类,它将接受URL并从给定的URL下载内容,然后返回下载的内容
例如:
public class MyAsyncTask extends AsyncTask<String, Void, String>{
ProgressDialog dialog;
protected void onPreExecute() {
super.onPreExecute();
dialog = ProgressDialog.show(context, "Loading", "Please wait...", true);
}
protected String doInBackground(String... params) {
// do download here
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
dialog.dismiss();
}
}
我知道使用
get()
方法将使整个过程成为一个同步任务。但是我想把结果返回给调用类。我也知道,为了防止它,我必须实现一个接口。但是因为我在同一个类中有多个调用,所以这是不可能的。有谁能给我一个解决这个问题的方法吗?为什么在同一个类中进行多次调用会破坏一个接口
class Task extends AsyncTask{
public interface TaskDoneListener{
public void onDone(String result);
}
private TaskDoneListener listener;
public Task(TaskDoneListener list){
super();
listener = list;
}
public void onPostExecute(String result){
listener.onDone(result);
}
}
由于
doInBackground
在后台工作,因此从活动调用时,无法在其返回值中获得结果
您需要设置一个回调函数,该函数将随结果一起被调用
例如:
interface Callback{
void onResult(String result);
}
让您的活动在活动中实现此目标
void onResult(String result){
//Do something
}
现在将您的异步任务更改为:
public class MyAsyncTask extends AsyncTask<String, Void, String>{
ProgressDialog dialog;
Callback callback;
public MyAsyncTask(Callback callback){
this.callback=callback;
}
protected void onPreExecute() {
super.onPreExecute();
dialog = ProgressDialog.show(context, "Loading", "Please wait...", true);
}
protected String doInBackground(String... params) {
//do download here
}
protected void onPostExecute(String result) {
super.onPostExecute(result);
callback.onResult(result);
dialog.dismiss();
}
}
因此,当您收到响应时,
onResult
将被调用我建议您为此创建一个abstract
类:
public abstract class AsyncDownloader extends AsyncTask<...> {
doInBackground(Params...){
return doNetworkDownload();
}
ABSTRACK onPostExecute(Result);// Notice there's no method body
}
在类中重写
onPostExecute
,将结果返回到类中
MyAsyncTask mytask = new MyAsyncTask(){
@Override
protected void onPostExecute(String result) {
//your code
}
}
mytask.execute(url);
您应该创建一个接口,并在该接口中添加一个具有要从AsyncTask返回的参数类型的方法 并在AsyncTask的构造函数中传递来自活动的接口引用。并从onPostExecute()在接口方法中设置数据 所以当从onPostExecute方法设置数据时,将在activity类中通知您
按照这个漂亮的答案进行操作使用处理程序对主活动进行IPC,并使用处理程序向主活动发送消息。您是否尝试使用同一Asyn任务背靠背执行多个请求?请看一个完美的工作示例,但我的活动对异步任务有多个调用。因此,我的onResult()方法将在不同的情况下被激发。如何解决这个问题?一种方法是为每个异步任务调用提供不同的回调。检查我的编辑。这没关系,但如果操作耗时太长,可能无法在
onTaskCompleted
中获得结果,该问题已经记录在案,但我们可以通过自定义事件来解决。AsyncTask克服的一个实现是AsyncTaskLoader
及其子类Cursorloader
。请注意AsyncTask
的一般实现,即我必须开发一个应用程序,该应用程序使用来自服务器的数据填充ListView,直到我开发了自己的自定义事件后才填充该应用程序。@Gödel77 thanx供建议。。我可以得到任何简短的文档链接吗?我这里没有代码,对于这种情况,我的意思是,只需使用适当的侦听器开发您自己的事件类型。此侦听器应该侦听来自服务器的列表是否为空(当列表不为空时,我们将触发事件!),然后我们可以使用该列表填充适配器。您知道,CustomAdapter-ourAdapter=newcustomadapter(…,list)
和listView.setAdapter(ourAdapter)
。
public abstract class AsyncDownloader extends AsyncTask<...> {
doInBackground(Params...){
return doNetworkDownload();
}
ABSTRACK onPostExecute(Result);// Notice there's no method body
}
public class MainActivityAsyncTask extends AsyncDownloader {
//It will give you error, that you must implement the onPostExecute method at first
@Override
onPostExecute(Result){
doUiStuff();
}
}
MyAsyncTask mytask = new MyAsyncTask(){
@Override
protected void onPostExecute(String result) {
//your code
}
}
mytask.execute(url);