我看到了这个答案: How to get the result of OnPostExecute() to main activity because AsyncTask is a separate class?
但这不是我要问的,因为我的通话类有多次调用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();
}
}
我还有另一个在不同情况下调用AsyncTask
的课程
public class MyClass {
public method1(String url) {
String result = new MyAsyncTask().execute(url).get();
}
public method2(String url) {
String result = new MyAsyncTask().execute(url).get();
}
}
我知道使用get()
方法会使整个过程成为同步任务。但是我想把结果带回调用类。我也知道,为了防止它,我必须实现一个接口。但是因为我在同一个班级有多个电话,所以不可能。所以有人能给我一个想法来解决这个问题吗?
答案 0 :(得分:6)
当doInBackground
在后台工作时,您无法在从活动中调用时获得返回值的结果。
你需要设置一个回调函数,然后调用结果。
例如:
interface Callback{
void onResult(String result);
}
让您的活动在此活动中实施
void onResult(String result){
//Do something
}
现在将asyncTask更改为:
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();
}
}
从活动开始此任务时:
new MyAsyncTask(new Callback{
void onResult(String result){
//Do something
}
}).execute(url);
因此,当您收到回复时,onResult
会被调用
答案 1 :(得分:1)
为什么在同一个类中进行多次调用会破坏接口?
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);
}
}
答案 2 :(得分:0)
我建议您为此创建一个abstract
类:
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();
}
}
答案 3 :(得分:0)
在您的班级中覆盖onPostExecute
以将结果返回给您的班级。
MyAsyncTask mytask = new MyAsyncTask(){
@Override
protected void onPostExecute(String result) {
//your code
}
}
mytask.execute(url);
答案 4 :(得分:0)
您必须创建接口并在该接口中添加一个具有您想要从AsyncTask返回的参数类型的方法。
并在AsyncTask的构造函数中传递来自您活动的接口引用。并从onPostExecute()接口方法中设置数据。
因此,当从onPostExecute方法设置数据时,您将在活动类中被通知。