Android AsyncTask使用不同的参数
我正在尝试使用AsyncTask在android上下载一个文件。因为我想下载很多文件,所以我想通过参数传递文件的url。我还想在用户单击触发异步任务的按钮时更改UI。我发现,除了我需要传递的URL和活动本身之外,我还可以访问它的视图,以便更改它们。我的问题是如何让AsyncTask接受多个不同的参数 问题: 1。我认为唯一的方法是将第一个参数作为Object传递,这样任何东西都可以传递,对吗Android AsyncTask使用不同的参数,android,user-interface,android-asynctask,Android,User Interface,Android Asynctask,我正在尝试使用AsyncTask在android上下载一个文件。因为我想下载很多文件,所以我想通过参数传递文件的url。我还想在用户单击触发异步任务的按钮时更改UI。我发现,除了我需要传递的URL和活动本身之外,我还可以访问它的视图,以便更改它们。我的问题是如何让AsyncTask接受多个不同的参数 问题: 1。我认为唯一的方法是将第一个参数作为Object传递,这样任何东西都可以传递,对吗 public final Example extends AsyncTask<Objects, S
public final Example extends AsyncTask<Objects, String, String>
3。如何使用上述参数“something”来更改可见性(例如在视图中)
提前谢谢您的时间试试这个
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
new Example("URL","something").executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, new String[]{null});
else
new Example("URL","something").execute(new String[]{null});
和示例异步任务类
public class Example extends AsyncTask<String, Void, JSONObject> {
// variables passed in:
String url;
String something;
// constructor
public Example(String url, String something) {
this.url = url;
this.something = something;
}
@Override
protected void onPreExecute() {
}
@Override
protected JSONObject doInBackground(String... args) {
}
@Override
protected void onPostExecute(JSONObject jObjOut) {
}
}
公共类示例扩展了异步任务{
//传入的变量:
字符串url;
串东西;
//建造师
公共示例(字符串url、字符串某物){
this.url=url;
这个,某物,某物;
}
@凌驾
受保护的void onPreExecute(){
}
@凌驾
受保护的JSONObject doInBackground(字符串…args){
}
@凌驾
受保护的void onPostExecute(JSONObject jObjOut){
}
}
使用AsyncTask
的想法是避免在执行阻止操作(如场景的文件下载)时影响UI的响应。当您使用AsyncTask时,doInBackground
方法在UI之外的另一个线程中执行,并且不能从中修改UI,因此没有必要向其传递任何与UI相关的数据
为了在后台工作完成后修改UI,可以使用onPostExecute
方法。正如@Tamilan所建议的,如果您想在那里使用Activity
对象,可以将它传递给AsyncTask
的构造函数
下面是一个示例任务。请注意,如果仍要将不同的对象类型传递给doInBackground
方法,则可以将String
替换为URL
,甚至可以将Object
替换为。此外,本示例不包括返回简单布尔值以外的错误处理
private class ExampleTask extends AsyncTask<String, Integer, Boolean>
{
private Activity mActivity;
public ExampleTask(Activity activity)
{
mActivity = activity;
}
@Override
protected Boolean doInBackground(String... params) {
// this is executed in a background thread
boolean success = true;
// do your background operations
publishProgress(50);
// more operations
return Boolean.valueOf(success);
}
@Override
protected void onProgressUpdate(Integer... progress) {
updateProgressbar(progress[0]); // update UI
}
@Override
protected void onPostExecute(Boolean result) {
// this is executed on your UI thread
if (!result)
// show error
else
// modify your UI
}
}
AsyncTask有3种通用类型:
1是您发送给执行的参数;
第二个用于在UI上发布更新
第三个是返回结果
如果要跳过其中一个或全部,请使用Void类:
示例:新建AsyncTask()
如果您想在AsyncTask中使用自己的构造函数,您应该在扩展AsyncTask的类中定义它,如下所示:
导入android.app.Activity;
导入android.os.AsyncTask
public class Example extends AsyncTask<Object, String, String>{
private Object data;
private String data1;
private String data2;
private Activity activity;
public Example(Object data, String data1, String data2, Activity activity){
this.data = data;
this.data1 = data1;
this.data2 = data2;
this.activity = activity;
}
@Override
protected String doInBackground(Object... arg0) {
//Do here all your needs except UI updating
//transfer data you need for UI updating like this:
publishProgress("UI update data argument");
return null;
}
@Override
protected void onProgressUpdate(String... arg){
super.onProgressUpdate(arg);
//Update your UI using activity
}
您可以使用参数化构造函数来实现相同的功能。但是请注意,如果您有多个参数,那么最终将创建多个构造函数。由于您需要修改多个活动作为响应,因此还需要传递一个上下文
query = UtilityClass.getQueries(UtilityClass.CHECKRIDE, paramsList);
new Example(HomeActivity.this, UtilityClass.CHECKRIDE).execute(query);
这就是创建查询/url并将其传递给AsyncTask的方法
示例异步任务:
public class Example extends AsyncTask<String , Void, String> {
public Example(Context contextVar, int calloutTypeVar){
context = contextVar;
CALLOUTTYPE = calloutTypeVar;
}
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(context, "Please wait", "Loading...");
}
@Override
protected String doInBackground(String...sqlQueryList) {
String result = "";
String sqlQuery = sqlQueryList[0];
result = UtilityClass.doHttpCallout(sqlQuery);
return result;
}
// Handle the response from the callout
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
progressDialog.dismiss();
switch (CALLOUTTYPE) {
case UtilityClass.SCHEDULERIDE:
ResponseHandlerClass.scheduleRide(result, context);
break;
}
}
公共类示例扩展了异步任务{
公共示例(上下文contextVar、int calloutTypeVar){
context=contextVar;
callout类型=callout类型变量;
}
@凌驾
受保护的void onPreExecute(){
progressDialog=progressDialog.show(上下文“请稍候”、“加载…”);
}
@凌驾
受保护的字符串doInBackground(字符串…sqlQueryList){
字符串结果=”;
字符串sqlQuery=sqlQueryList[0];
结果=UtilityClass.doHttpCallout(sqlQuery);
返回结果;
}
//处理来自调用的响应
@凌驾
受保护的void onPostExecute(字符串结果){
//TODO自动生成的方法存根
super.onPostExecute(结果);
progressDialog.disclose();
开关(类型){
案例效用类.SCHEDULERIDE:
scheduleRide(结果、上下文);
打破
}
}
我已经实现了一个响应处理程序来处理来自各种调用结果的响应
希望这有助于处理来自不同URL的响应。使用异步地址的构造函数,然后就可以全部通过。@Tamilan您能给我提供一个示例或参考吗?请更新构造函数(或类名)为了匹配或不编译。@Mario我发布了示例异步任务
类并检查它。@Tamilan;-)如果Mario只需要传递URL,他可以使用AsyncTask的第一个参数,而不是使用构造函数,然后传递新字符串[]{null}在执行中。@Tanilan thx现在又清楚多了!我明白了它是怎么做到的works@fasteque是的,但给出一个更广泛的示例更好。现在,程序员需要根据自己的代码调整这个示例!在哪里执行onProgressUpdate()方法(新线程或主线程)?我想在那里更新进度条,但它崩溃了,所以我需要将其作为参数传递?对吗?onProgressUpdate
在UI线程中像onPostExecute
一样执行,因此您可以安全地在那里修改进度条(可以通过构造函数或setter传递).doInBackground
是在后台线程中执行的唯一方法。有关详细信息,请检查。@Mario I使用onProgressUpdate
new Example(data, data1, data2, activity).execute(object);
query = UtilityClass.getQueries(UtilityClass.CHECKRIDE, paramsList);
new Example(HomeActivity.this, UtilityClass.CHECKRIDE).execute(query);
public class Example extends AsyncTask<String , Void, String> {
public Example(Context contextVar, int calloutTypeVar){
context = contextVar;
CALLOUTTYPE = calloutTypeVar;
}
@Override
protected void onPreExecute() {
progressDialog = ProgressDialog.show(context, "Please wait", "Loading...");
}
@Override
protected String doInBackground(String...sqlQueryList) {
String result = "";
String sqlQuery = sqlQueryList[0];
result = UtilityClass.doHttpCallout(sqlQuery);
return result;
}
// Handle the response from the callout
@Override
protected void onPostExecute(String result) {
// TODO Auto-generated method stub
super.onPostExecute(result);
progressDialog.dismiss();
switch (CALLOUTTYPE) {
case UtilityClass.SCHEDULERIDE:
ResponseHandlerClass.scheduleRide(result, context);
break;
}
}