您的位置:首页 > 移动开发 > Android开发

Android异步任务处理之AsyncTask异步操作类的使用方法1(不含onCancelled部分)

2015-12-12 00:20 507 查看


创建一个新工程LearnAsyncTask,一个空Activity,上面放置几个控件

控件
属性
功能描述
EditText
id="@+id/etUri"

hint="
请输入你要获取网络数据的Uri"

text="http://www.sina.com.cn"
Button
text="读取http数据"

id="@+id/btnRead"
/
ScrollView
由于读取的内容可能很长,会好几页,所有用此包裹TextView
TextView
id="@+id/tvRead"

hint="
读取的数据http数据将在此显示"
<


本程序介绍:AsyncTask
的用法,包括传入参数、设定后台任务doInBackground、过程信息的处理(publishProgress方法和onProgressUpdate事件)等

AsyncTask
第一个参数:是传入的对象(用户对AsyncTask进行初始化的一些数据),第二个参数:处理的过程中返回值的数据类型;第三个参数:返回结果的数据类型

/为AsyncTask实例对象必须实现(原来未实现)doInBackground方法,该方法与线程的run方法非常类似,执行后台的耗时操作,不能在此代码中直接操作UI

构成函数的第一个参数会传给doInBackground的params的第一个数据

只可以execute一次,执行多次就报异常


可能需要重写的方法和事件



doInBackground

不要手工调用

该方法中调用的publishProgress()中传入的数据类型与AsyncTask的第二个参数类型必须一致,否则会报错。也与onProgressUpdate的参数一致



onCancelled


终止操作(本实例中不做讲解,有空再讲解哦)


onCancelled(Strings)



终止操作(本实例中不做讲解,有空再讲解哦)


onPostExecute

不要手工调用,AsyncTask执行之后会调用该事件


onPreExecute


不要手工调用,AsyncTask执行之前会调用该事件


onProgressUpdate


执行任务的过程中,用于对外发布当前执行任务的进度。参数与声明AsyncTask的第二个参数一致







publicclassMainActivityextendsAppCompatActivity{

privateTextViewtvRead;

privateEditTextetUri;

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

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

etUri=(EditText)findViewById(R.id.etUri);

findViewById(R.id.btnRead).setOnClickListener(newView.OnClickListener(){

@Override

publicvoidonClick(Viewv){

newReadHttpAsyncTask().execute(etUri.getText().toString());

}

});

}

//读取http数据的方法

privateclassReadHttpAsyncTaskextendsAsyncTask<String,Integer,String>{

@Override

protectedvoidonCancelled(){

super.onCancelled();

}

@Override

protectedvoidonCancelled(Strings){

super.onCancelled(s);

}

@Override

protectedvoidonPostExecute(Strings){

tvRead.setText(s);

super.onPostExecute(s);

}

@Override

protectedvoidonPreExecute(){

super.onPreExecute();

}

@Override

protectedvoidonProgressUpdate(Integer...values){

super.onProgressUpdate(values);

setTitle("已经完成比例"+Integer.toString(values[0]));

}

//*doInBackground中不能直接操作UI。

@Override

protectedStringdoInBackground(String...params){

try{

URLurl=newURL(params[0]);

URLConnectionconnection=url.openConnection();

inttotal=connection.getContentLength();//获取要读取的内容总数量

InputStreamis=connection.getInputStream();

InputStreamReaderisr=newInputStreamReader(is,"utf-8");

BufferedReaderbr=newBufferedReader(isr);

Stringline;

StringBuilderstringBuilder=newStringBuilder();

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

stringBuilder.append(line);

System.out.println("===输出信息到Logcat:"+line);

//注意publishProgress中传入的数据类型与AsyncTask的第二个参数类型必须一致,否则会保存

publishProgress(stringBuilder.toString().length()/total);

}

br.close();

isr.close();

is.close();

returnstringBuilder.toString();

}catch(MalformedURLExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}catch(IOExceptione){

//TODOAuto-generatedcatchblock

e.printStackTrace();

}

returnnull;

}

}

}




内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: