Android學習---使用非同步內部類實現進度條載入效果
阿新 • • 發佈:2018-11-01
Android學習—使用非同步內部類
為什麼要用AsyncTask?
答:我們可以用上述兩種方法來完成我們的非同步操作,加入要我們寫的非同步操作比較多,或者較為繁瑣,
難道我們new Thread()然後用上述方法通知UI更新麼?程式設計師都是比較喜歡偷懶的,既然官方給我
們提供了AsyncTask這個封裝好的輕量級非同步類,為什麼不用呢?我們通過幾十行的程式碼就可以完成
我們的非同步操作,而且進度可控;相比起Handler,AsyncTask顯得更加簡單,快捷~當然,這隻適合
簡單的非同步操作,另外,實際非同步用的最多的地方就是網路操作,圖片載入,資料傳輸等,AsyncTask
暫時可以滿足初學者的需求,謝謝小應用,但是到了公司真正做專案以後,我們更多的使用第三發的
框架,比如Volley,OkHttp,android-async-http,XUtils等很多,後面進階教程我們會選1-2個框架進行
學習,當然你可以自己找資料學習學習,但是掌握AsyncTask還是很有必要的!
2)AsyncTask的基本結構:
AsyncTask是一個抽象類,一般我們都會定義一個類繼承AsyncTask然後重寫相關方法~
官方API:AsyncTask
• 構建AsyncTask子類的引數:
• 相關方法與執行流程:
• 注意事項:`
後臺程式碼
package com.example.administrator.myapplication;
import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView tv;
Button btn;
ProgressBar pg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
pg = (ProgressBar) findViewById(R.id.progressBar);
btn=(Button)findViewById(R.id.btn);
tv=(TextView)findViewById(R.id.tv);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MyTask mt=new MyTask();
mt.execute(1000);
}
});
}
//onPreExecute()-> doInBackground ->
class MyTask extends AsyncTask<Integer,Integer,String>{
int i;
@Override
protected void onPreExecute() {
super.onPreExecute();
tv.setText("start");
}
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
tv.setText("finsh");
}
@Override
protected String doInBackground(Integer... integers) {
try {
for (i= 0; i<=100; i++){
Thread.sleep(integers[0]);
publishProgress(i);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(Integer... values)
{
super.onProgressUpdate(values);
pg.setProgress(values[0]);
}
}
}
效果圖