AsyncTask的参数介绍

AsyncTask<Params, Progress, Result>的三个参数

doInBackground(Params...)

publishProgress(Progress...)

onProgressUpdate(Progress...)

onPostExecute(Result)

看这四个方法的参数你就知道上面的三个参数是给谁用的了!

 

AsyncTask的四个方法(步骤)

1、onPreExecute():这个方法是在任务开始前进行的,它由UI线程(主线程)调用,即可以进行UI操作。在最后,我会给出Log的打印信息。

2、doInBackground(Params...):这个方法是onPreExecute()完成后,立即在后台进行的,用以执行任务,并将Result传给onPostExecute(Result)。另外,在此期间,可以调用publishProgress(Progress...),这个方法能够传递一些数据给onProgressUpdate(Progress...)

3、onProgressUpdate(Progress...):publishProgress(Progress...)被调用之后,此方法会由UI线程调用。所以利用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();
        }   
    }
}

 

posted @ 2018-01-03 15:28  XinYiBuFang  阅读(1387)  评论(0编辑  收藏  举报