为避免主线程失去响应,Android把耗时的操作发在新的线程中完成
更新主线程的方法:
1.使用Handler实现线程通信
2.Activity.runOnUiThread(Runnable)
3.View.post(Runnable,long)
4.View.postDelayed(Runnable,long)
后三种编程复杂,用异步任务AsyncTask可简化,不需要借助线程和Handler
AysncTask<Params,Progress,Result>是抽象类
Params:输入参数类型
Progress:后台任务完成进度值类型
Result:返回结果类型
使用步骤:
1.创建AsyncTask子类,为泛型参数指定类型,不指定默认为void
2.实现AsyncTask方法,一般来说必须实现doInBackground(Params...),这是后台线程要完成的任务,还需注意这里Params是有“...”,这个不能丢
3.调用实例的execute(Params...params)开始执行
使用规则:
1.必须在主线程创建AsyncTask实例
2.必须在主线程调用AsyncTask的execute()方法 (以前有一次就忘了,导致程序一直不对,望注意)
3.每个AsyncTask只能被执行一次,多次调用引发异常
4.AsyncTask的四个方法不能自己调用,不能是m.doInBackground(Params...);这是错误的
</pre></p><p><pre name="code" class="plain"><pre name="code" class="plain">public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
NetTask netTask = new NetTask(this);
netTask.execute("http://www.baidu.com");
}
class NetTask extends AsyncTask<String, String, String>(){
protected void onPreExecute(){
}
@Override
protected String doInBackground(String... params) {
StringBuffer paramsStr = new StringBuffer();//参数对
for (int i = 0; i < kvs.length; i += 2){
paramsStr.append(kvs[i]).append("=").append(kvs[i+1]).append("&");
}
//网络连接
try {
URLConnection uc = new URL(url).openConnection();
uc.setDoInput(true);//往服务器输出
uc.setDoOutput(true);
BufferedWriter bw = new BufferedWriter(
new OutputStreamWriter(
uc.getOutputStream(), Config.CHARSET));
bw.write(paramsStr.toString());//上传参数
bw.flush();
/* switch (method){
case POST:
uc = new URL(url).openConnection();
uc.setDoInput(true);//往服务器输出
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(uc.getOutputStream(), Config.CHARSET));
bw.write(paramsStr.toString());//上传参数
bw.flush();
break;
default:
uc = new URL(url+"?"+paramsStr.toString()).openConnection();
break;
}*/
// System.out.println("request url:"+uc.getURL());
System.out.println("request data"+paramsStr);
//读取数据
BufferedReader br = new BufferedReader(new InputStreamReader(uc.getInputStream(),Config.CHARSET));
String line = null;
StringBuffer result = new StringBuffer();
while ((line = br.readLine())!=null){
result.append(line);
}
System.out.println("result:"+result);
return result.toString();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) { //操作主线程内容
if (result!=null){
if (successCallback!=null){
successCallback.onSuccess(result);
}
}else {
if (failCallback!=null){
failCallback.onFail();
}
}
super.onPostExecute(result);
}
}
public static interface SuccessCallback{
void onSuccess(String result);
}
public static interface FailCallback{
void onFail();
}
}