AsyncTask的参数介绍
AsyncTask<Params, Progress, Result>的三个参数
看这四个方法的参数你就知道上面的三个参数是给谁用的了!
AsyncTask的四个方法(步骤)
1、onPreExecute():这个方法是在任务开始前进行的,
它由UI线程(主线程)调用,即可以进行UI操作。在最后,我会给出Log的打印信息。
2、doInBackground(Params...):这个方法是
onPreExecute()完成后,立即在后台进行的,用以执行任务,并将
Result
传给onPostExecute(Result)
。另外,在此期间,可以调用publishProgress(Progress...)
,这个方法能够传递一些数据给onProgressUpdate(Progress...)
。
3、onProgressUpdate(Progress...):在
被调用之后,此方法会由UI线程调用。所以利用publishProgress(Progress...)
publishProgress(Progress...)
和onProgressUpdate(Progress...)就能够做出在加载或读取网络数据时的等待或缓冲的UI效果。我在最后给出的效果图有类似的功能。
4、onPostExecute(Result):在
doInBackground(Params...)
完成后,由UI线程调用,在这里处理Result
。
泛型参数可以是任何类型,那多参数怎么传呢?
public class GetCityListTask extends AsyncTask<String, Integer, String> { public String ResultStr; ///这个方法是onPreExecute()完成后,立即在后台进行的,用以执行任务,并将Result传给onPostExecute(Result)。 ///另外,在此期间,可以调用publishProgress(Progress...),这个方法能够传递一些数据给onProgressUpdate(Progress...)。 @Override protected String doInBackground(String... params) {
String x=params[0];
return null;
} }
在主线程获取返回值
1 创建一个接口
import java.util.List; public interface AsyncResponse { void onDataReceivedSuccess(List<String> listData); void onDataReceivedFailed(); }
2 在AsyncTask中通过此接口获取到onPostExecute中的数值
class SocketConnAsync extends AsyncTask<String, Void, String> { public AsyncResponse asyncResponse; public void setOnAsyncResponse(AsyncResponse asyncResponse) { this.asyncResponse = asyncResponse; } @Override protected String doInBackground(String... params) { dataReceived = something; return dataReceived; } @Override protected void onPostExecute(String msg) { super.onPostExecute(msg); if (msg != null) { List<String> listData = new ArrayList<String>(); listData = parseJsonResponse(msg);//解析msg的一个函数 asyncResponse.onDataReceivedSuccess(listData);//将结果传给回调接口中的函数 } else { asyncResponse.onDataReceivedFailed(); } } }
3 在Activity中实现此接口即可
public class MainActivity extends Activity { private ListView environListView; private List<String> environmentList = null;//listview上显示的数据源 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.listview_environment); sendRequestForListData(); } private void sendRequestForListData() { try { final SocketConnAsync socketConn = new SocketConnAsync(); socketConn.execute(params); socketConn.setOnAsyncResponse(new AsyncResponse() { //通过自定义的接口回调获取AsyncTask中onPostExecute返回的结果变量 @Override public void onDataReceivedSuccess(List<String> listData) { Log.d(TAG, "onDataReceivedSuccess"); environmentList = listData;//如此,我们便把onPostExecute中的变量赋给了成员变量environmentList } @Override public void onDataReceivedFailed() { ToastUtil.show(MainActivity.this, "data received failed!"); } }); } catch (Exception e) { e.printStackTrace(); } } }