无论如何使用AsyncTask而不传入任何参数?我目前正在传递一个空字符串,但我没有做任何事情:
DownloadWebPageTask task = new DownloadWebPageTask();
task.execute(new String[] { "" });
class DownloadWebPageTask extends AsyncTask<String, Void, String> {
private final ProgressDialog dialog = new ProgressDialog(MainScreen.this);
@Override
protected void onPreExecute() {
dialog.setMessage("Gathering data for\n"+selectedSportName+".\nPlease wait...");
dialog.show();
}
@Override
protected String doInBackground(String... urls) {
//go do something
return "";
}
@Override
protected void onPostExecute(String result) {
dialog.dismiss();
startTabbedViewActivity();
}
}
private void startTabbedViewActivity(){
Intent intent = new Intent(MainScreen.this, TabbedView.class);
intent.putExtra(SPORT_NAME_EXTRA, selectedSportName);
intent.putExtra(HEADLINES_FOR_SPORT_EXTRA, existingSportHeadlines.get(selectedSportName));
intent.putExtra(SCORES_FOR_SPORT_EXTRA, existingSportScores.get(selectedSportName));
intent.putExtra(SCHEDULE_FOR_SPORT_EXTRA, existingSportSchedule.get(selectedSportName));
startActivity(intent);
}
出于某种原因,当我运行如图所示的代码时,doInBackground()中没有任何事情发生,对话框消失,TabbedView活动开始。
但是,当我使用doInBackground()运行某些代码时,对话框会消失,但TabbedView活动将无法启动。所以我想知道我是否可以做任何不同的事情?
答案 0 :(得分:5)
是的,您可以使用AsyncTask
而不将String
传递给doInBackground()
方法。
只需将第一种和第三种通用类型从String
更改为Void
:
class DownloadWebPageTask extends AsyncTask<Void, Void, Void> {
}
异步任务使用的三种类型如下:
1)Params,执行时发送给任务的参数类型。
2)进度,
期间发布的进度单位的类型3)背景计算。结果,结果的类型 背景计算。
对于onPostExecute
的签名,试试这个:
@Override
protected void onPostExecute(Void unused) {
}
修改强>:
对于参数,它实际上非常简单。
考虑一下:
class MyTask extends AsyncTask<Type1, Type2, Type3> {
@Override
protected void onPreExecute() {
}
@Override
protected Type3 doInBackground(Type1... param) {
}
@Override
protected void onProgressUpdate(Type2... progress) {
}
@Override
protected void onPostExecute(Type3 result) {
}
}
为了确定 Type1 , Type2 和 Type3 应该是什么,你将不得不问自己3个问题:
我应该将哪个参数传递给我的任务? =&GT; 类型1
处理过程中需要显示的中间结果的类型是什么? =&GT;
2型
结果操作的类型是什么? =&GT; 的Type3
在您的情况下,我不知道您正在下载数据的URL是全局定义还是要将其传递给任务。如果它是全局定义的,那么 Type1 应该 Void 。
如果要将其传递给任务,则可以将其传递给doInBackground()
方法, Type1 将 String 。
显然,对于您的情况,您不需要担心 Type2 ,因为您没有发布任何中间结果,因为您没有对onPostExecute()
中的结果做任何事情,那么Type3
也是Void
。
总结一下,你将拥有:
class DownloadWebPageTask extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... urls) {
// do something with urls[0]
}
@Override
protected void onPostExecute(Void unused) {
// dismiss pd and start new intent
}
}
或者:
class DownloadWebPageTask extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... unused) {
}
@Override
protected void onPostExecute(Void unused) {
// dismiss pd and start new intent
}
}
根据您的需要而定。这够清楚了吗?
答案 1 :(得分:1)
您可以为Void
generics
AsyncTask
class DownloadWebPageTask extends AsyncTask<Void, Void, Void> {