AsyncTask异步任务类的使用

来源:互联网 发布:c语言在线编译 输入 编辑:程序博客网 时间:2024/04/27 12:10

异步任务类的使用是为了,能够通过子线程加载数据,而在Ui线程刷新界面

下面通过一个例子具体讲解异步任务类的使用

1定义异步任务类,异步任务类必须继承AsyncTask

//三个参数的意义:第一个是启动任务执行的输入参数的类型,第二个参数是完成进度的值的类型,第三个是任务完成后返回结果的类型,这三个参数若不需要指定类型可写void

public classMyAsyncTask extends AsyncTask<URL, Integer, String>{

    ProgressDialogdialog;//进度条对话框

    int hasRead=0;//读取进度

    Contextcontext;

    int max;//进度的最大值

    private Results myResult;

    public MyAsyncTask(Contextcontext,intmax,Results result){

        this.context=context;

        this.max=max;

        this.myResult=result;

    }

    //后台线程执行的方法(相当于开启子线程加载数据),后台将要完成的任务执行的方法,调用publishProgress方法更新任务的执行进度

    @Override

    protected StringdoInBackground(URL... arg0) {

        StringBuilderbuilder=newStringBuilder();

        try {

            URLConnectionconn=arg0[0].openConnection();//创建网络连接对象

            BufferedReaderreader=newBufferedReader(newInputStreamReader(conn.getInputStream(),"UTF-8"));

            Stringline=null;

            while((line=reader.readLine())!=null){

                builder.append(line+"/n");

                hasRead++;

                publishProgress(hasRead);//通知进度刷新

            }

           

        }catch(IOException e) {

            e.printStackTrace();

        }

        return builder.toString();

    }

    //doinbackGround方法中调用publishProgress()方法更新进度后执行

    @Override

    protected voidonProgressUpdate(Integer... values) {

        super.onProgressUpdate(values);

        dialog.setMessage("已经读取了"+values+"");

        dialog.setProgress(values[0]);

    }

    //doinbackgroun执行完成后自动调用的方法,并将doinbackground的返回值传递给该方法

    @Override

    protected void onPostExecute(Stringresult) {

        super.onPostExecute(result);

        Toast.makeText(context, result, Toast.LENGTH_LONG).show();

        dialog.dismiss();

        myResult.getResult(result);

    }

    //该方法将在执行后台耗时操作前调用,用于准备工作,一般在doInbackground方法前执行

    @Override

    protected void onPreExecute() {

        super.onPreExecute();

        dialog=new ProgressDialog(context);

        dialog.setTitle("任务正在执行中");

        dialog.setMessage("任务正在执行中,请等待。。。。。");

        dialog.setCanceledOnTouchOutside(false);

        dialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//设置进度条对话框是水平显示进度的,STYLE_SPINNER是圆形的不能显示进度

        dialog.setMax(max);//设置进度的最大值

        dialog.setIndeterminate(false);//设置进度条是否显示进度

        dialog.show();

    }

   

//获取数据后的回调接口

    public interface Results{

        void getResult(Stringresult);

    }

}

2.定义异步任务类的实现类的实例,可通过方法启动异步任务类

num= (TextView) findViewById(R.id.num);

        num.setOnClickListener(new View.OnClickListener(){

           

            @Override

            public void onClick(View arg0) {

//定义异步任务类,必须定义在ui线程中,

MyAsyncTask task=newMyAsyncTask(MainActivity.this, 1,newMyAsyncTask.Results() {  

                    @Override

                    public void getResult(Stringresult) {

                        num.setText(result);

                    }

                });

        try {

                    task.execute(new URL("http://www.weather.com.cn/data/cityinfo/101010100.html"));//通过该方法让异步任务类执行耗时操作,必须在ui线程中执行,有多个重载方法

                }catch(MalformedURLException e) {

                    e.printStackTrace();

                }

            }

        });

java.io.EOFException异常:http://blog.csdn.net/jiuweitianhu_12345/article/details/52469127

例子:https://yunpan.cn/cMCm3IH5ErYjj (提取码:ef66)

0 0
原创粉丝点击