Android 异步任务AsyncTask

为避免主线程失去响应,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();
	    }
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值