安卓AsynTask异步任务的使用

1.在要实现异步任务的Activity需要继承AsyncTask类

public abstract class AsyncTask<Params, Progress, Result>

Params  “启动任务执行的输入参数”

Progress    “后台任务执行的进度”、

Result     “后台计算结果的类型”。

在特定场合下,并不是所有类型都被使用,如果没有被使用,可以用java.lang.Void类型代替。

2.实现需要的方法

1.execute(Params... params),执行一个异步任务,需要我们在代码中调用此方法,触发异步任务的执行。

2.onPreExecute(),在execute(Params... params)被调用后立即执行,一般用来在执行后台任务前对UI做一些标记。

3.doInBackground(Params... params),在onPreExecute()完成后立即执行,用于执行较为费时的操作,此方法将接收输入参数和返回计算结果。在执行过程中可以调用publishProgress(Progress... values)来更新进度信息。

4.onProgressUpdate(Progress... values),在调用publishProgress(Progress... values)时,此方法被执行,直接将进度信息更新到UI组件上。

5.onPostExecute(Result result),当后台操作结束时,此方法将会被调用,计算结果将做为参数传递到此方法中,直接将结果显示到UI组件上。

安卓AsynTask异步任务的使用_第1张图片


使用过AsyncTask 的同学都知道一个异步加载数据最少要重写以下这两个方法:

  • doInBackground(Params…) 后台执行,比较耗时的操作都可以放在这里。注意这里不能直接操作UI。此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress…)来更新任务的进度。
  • onPostExecute(Result)  相当于Handler 处理UI的方式,在这里面可以使用在doInBackground 得到的结果处理操作UI。 此方法在主线程执行,任务执行的结果作为此方法的参数返回

有必要的话你还得重写以下这三个方法,但不是必须的:

  • onProgressUpdate(Progress…)   可以使用进度条增加用户体验度。 此方法在主线程执行,用于显示任务执行的进度。
  • onPreExecute()        这里是最终用户调用Excute时的接口,当任务执行之前开始调用此方法,可以在这里显示进度对话框。
  • onCancelled()             用户调用取消时,要做的操作

使用AsyncTask类,以下是几条必须遵守的准则:

  • Task的实例必须在UI thread中创建;
  • execute方法必须在UI thread中调用;
  • 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法;
  • 该task只能被执行一次,否则多次调用时将会出现异常; 
下面举一个简单的例子实现简单的功能。
假设有一个方法是需要联网查询远程的数据库中有没有相应的记录,如 TestLogin(username,password),成功返回true。现在用异步来实现用户登陆的功能。
在登陆界面的Activity中内嵌一个继承AsyncTask的类。因为这里要传入username,password,传出true,所以应该这样写:
private class APITestTask extends AsyncTask<String, Void, Object> {
      protected Object doInBackground(String... params) {
// TODO Auto-generated method stub
Object object = TestFunction.testLogin(getApplicationContext(), params[0], params[1]);
return object;
       }
       protected void onPostExecute(Object result) {  
      if(result.equals("true")){
      Log.i("login_testinfo", "loginsucessfully");
      //跳转到登陆成功后的界面
      }
    }  
对登陆按钮添加下面的时间监听:
 loginBtn.setOnClickListener(new View.OnClickListener() {  
        @Override  
            public void onClick(View v) {  
                // TODO Auto-generated method stub  
        EditText username = (EditText)findViewById(R.id.username_edit);  
        EditText password = (EditText)findViewById(R.id.password_edit);
        EditText place = (EditText)findViewById(R.id.place_edit);
        //Log.i("username", username.getText().toString());
        //Log.i("password", password.getText().toString());
        APITestTask login = new APITestTask();
        login.execute(username.getText().toString(),password.getText().toString());
       
        }
            
        });  
        }


当单击登陆按钮时,  APITestTask的一个实例被创建, execute方法启动后台线程的执行,这是代码跳转到doInBackground执行,接收 execute
传来的username,password属性, doInBackground执行完成之后,自动执行onPostExecute方法,doInBackground的结果被返回到result中作为本方法的传入值,在这个方法中就可以根据返回的结果做进一步的操作。




你可能感兴趣的:(android,AsyncTask)