1. 程式人生 > >AsyncTask類的基礎使用,小小基礎瞭解.

AsyncTask類的基礎使用,小小基礎瞭解.

在Android中我們可以通過Thread+Handler實現多執行緒通訊,不過為了更加方便我們在子執行緒中更新UI元素,Android從1.5版本就引入了一個AsyncTask類,使用它就可以非常靈活方便地從子執行緒切換到UI執行緒.AsyncTask內部會對其進行管理,這樣我們就只需要關注於我們的業務邏輯.

AsyncTask的基本用法

首先來看一下AsyncTask的基本用法,由於AsyncTask是一個抽象類,所以如果我們想使用它,就必須要建立一個子類去繼承它。在繼承時我們可以為AsyncTask類指定三個泛型引數,這三個引數的用途如下:

  1. Params

在執行AsyncTask時需要傳入的引數,可用於在後臺任務中使用。(進入自定義類時我所傳入的引數型別)…

  1. Progress

後臺任務執行時,如果需要在介面上顯示當前的進度,則使用這裡指定的泛型作為進度單位…

  1. Result

當任務執行完畢後,如果需要對結果進行返回,則使用這裡指定的泛型作為返回值型別.(返回值型別)…

 這裡:AsyncTask有四個重要的回撥方法,分別是:onPreExecute、doInBackground, onProgressUpdate 和 onPostExecute。 

一,一 : 給各位列舉下:

*~~~~ onPreExecute

*
該方法的簽名如下所示:
在這裡插入圖片描述
該方法是執行在主執行緒中的。在AsyncTask執行了execute()方法後就會在UI執行緒上執行onPreExecute()方法,該方法在task真正執行前執行.
*~~~~doInBackground*
該方法的簽名如下所示:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20181102204912580.png
該方法是執行在單獨的工作執行緒中的,而不是執行在主執行緒中。doInBackground會在onPreExecute()方法執行完成後立即執行,該方法用於在工作執行緒中執行耗時任務
**~~~~onProgressUpdate **
該方法簽名如下:
![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20181102205044671.png
該方法是在主執行緒上被呼叫的,且傳入的引數是Progress泛型定義的不定長陣列。如果在doInBackground中多次呼叫了publishProgress方法,那麼主執行緒就會多次回撥onProgressUpdate方法。
**~~~~onPostExecute **
該方法簽名如下:
在這裡插入圖片描述

該方法是在主執行緒中被呼叫的。當doInBackgroud方法執行完畢後,就表示任務完成了

以上就是基礎的一些解釋和註解.都是大牛的總結.
這是我寫的一個小小的程式碼原文:
public class MainActivity extends AppCompatActivity {

private String urlString = "https://suggest.taobao.com/sug?code=utf-8&q=%E6%89%8B%E6%9C%BA";
private ListView listView;
List<List<String>> data = new ArrayList<List<String>>();
private MyAdapter myAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //網路狀態
    int net = NetState.getNet(MainActivity.this);
    if (net == -1){
        Toast.makeText(this, "請檢查網路", Toast.LENGTH_SHORT).show();
    }else{
        Toast.makeText(this, "正在使用蜂窩網路", Toast.LENGTH_SHORT).show();
    }
    //初始化元件
    listView = findViewById(R.id.listView);

    //非同步汆熟資料
    new MyAsync().execute(urlString);
    //介面卡
    myAdapter = new MyAdapter();
    listView.setAdapter(myAdapter);
    //
    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String s = data.get(position).toString();
            Toast.makeText(MainActivity.this, "資料為:" + s, Toast.LENGTH_SHORT).show();
        }
    });
}

class MyAsync extends AsyncTask<String, Void, String> {

   /* @Override
    protected void onPreExecute() {
        super.onPreExecute();
    }*/
    @Override
    protected String doInBackground(String... strings) {
        //////
        String string = MyUtil.getString2(strings[0]);
        return string;
    }
   /* @Override
    protected void onProgressUpdate(Void... values) {

    }*/
    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        //gson
        Gson gson = new Gson();
        Shouji shouji = gson.fromJson(s, Shouji.class);
        List<List<String>> result = shouji.getResult();
        data.addAll(result);
        myAdapter.notifyDataSetChanged();
    }

}

class MyAdapter extends BaseAdapter {

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = View.inflate(MainActivity.this, R.layout.item, null);
        TextView byId = convertView.findViewById(R.id.textView);
        byId.setText(data.get(position).toString());
        return convertView;
    }
}


採用android封裝好的AsyncTask直接請求StringRul利用Gson將其轉換在ListView中展示.
自定義類中的方法採用HttpClient

public static String getString2(String string) {

    //HttpClient
    DefaultHttpClient defaultHttpClient = new DefaultHttpClient();
    HttpGet httpGet = new HttpGet(string);
    try {
        HttpResponse execute = defaultHttpClient.execute(httpGet);
        int statusCode = execute.getStatusLine().getStatusCode();
        if (statusCode == 200) {
            HttpEntity entity = execute.getEntity();
            String s = EntityUtils.toString(entity);
            return s;
        }


    } catch (IOException e) {
        e.printStackTrace();
    }

    return "";
}

還有一種方法獲取網路狀態的string

public static String getString(String string) {

    //URLconnection
    try {
        try {
            URL url = new URL(string);
            HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
            int responseCode = urlConnection.getResponseCode();
            if (responseCode == 200) {
                InputStream inputStream = urlConnection.getInputStream();
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                String temps = "";
                StringBuilder stringBuilder = new StringBuilder();
                while ((temps = bufferedReader.readLine()) != null) {
                    stringBuilder.append(temps);
                }
                return stringBuilder.toString();
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return "";
}

望有所助…
很軟肋的小菜文章奉上…