AsyncTask類的基礎使用,小小基礎瞭解.
阿新 • • 發佈:2018-12-15
在Android中我們可以通過Thread+Handler實現多執行緒通訊,不過為了更加方便我們在子執行緒中更新UI元素,Android從1.5版本就引入了一個AsyncTask類,使用它就可以非常靈活方便地從子執行緒切換到UI執行緒.AsyncTask內部會對其進行管理,這樣我們就只需要關注於我們的業務邏輯.
AsyncTask的基本用法
首先來看一下AsyncTask的基本用法,由於AsyncTask是一個抽象類,所以如果我們想使用它,就必須要建立一個子類去繼承它。在繼承時我們可以為AsyncTask類指定三個泛型引數,這三個引數的用途如下:
- Params
在執行AsyncTask時需要傳入的引數,可用於在後臺任務中使用。(進入自定義類時我所傳入的引數型別)…
- Progress
後臺任務執行時,如果需要在介面上顯示當前的進度,則使用這裡指定的泛型作為進度單位…
- Result
當任務執行完畢後,如果需要對結果進行返回,則使用這裡指定的泛型作為返回值型別.(返回值型別)…
…
這裡:AsyncTask有四個重要的回撥方法,分別是:onPreExecute、doInBackground, onProgressUpdate 和 onPostExecute。
一,一 : 給各位列舉下:
*~~~~ onPreExecute
該方法的簽名如下所示:
該方法是執行在主執行緒中的。在AsyncTask執行了execute()方法後就會在UI執行緒上執行onPreExecute()方法,該方法在task真正執行前執行.
*~~~~doInBackground*
該方法的簽名如下所示:
該方法是執行在單獨的工作執行緒中的,而不是執行在主執行緒中。doInBackground會在onPreExecute()方法執行完成後立即執行,該方法用於在工作執行緒中執行耗時任務
**~~~~onProgressUpdate **
該方法簽名如下:
該方法是在主執行緒上被呼叫的,且傳入的引數是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 "";
}
望有所助…
很軟肋的小菜文章奉上…