android异步操作
程序员文章站
2022-03-13 22:43:50
...
因为一次偶然的机会让我对移动开发产生了浓厚的兴趣,于是就把mars老师的四季的视频全都下载了下来开始自学android,之前看视频自学一直也没写过博客,现在也看到了第四季就想写一写博客分享一下我的学习经历。
1、要实现异步操作就要用到android提供一个AsyncTask类,这个类是一个泛型。下面附上我的代码,我直接在代码中说明
package com.example.async2; import android.os.AsyncTask; import android.view.View; import android.widget.ProgressBar; import android.widget.TextView; /** * 1、继承AsyncTask<E1, E2, E3>,其中E1,E2,E3分别是三个类型 * 2、必须要重写的方法是doInBackground方法 * 3、第一个类型对应doInBackground方法的参数类型 * 4、第二个类型对应于onProgressUpdate方法的参数类型 * 5、第三个对应于onPostExecute方法的参数类型 * 6、在生成该类的对象来实现异步操作的时候要调用execute方法 * 7、调用该方法之后首先执行的是onPreExecute方法,然后执行doInBackground方法,最后执行onPostExecute方法 * * @author why * */ public class ProgressBarAsyncTask extends AsyncTask<Integer, Integer, String> { // UI线程中的文本框控件 private TextView textView = null; // UI线程中的进度条控件 private ProgressBar progressBar = null; public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) { this.textView = textView; this.progressBar = progressBar; } /** * 改方法不运行在UI线程之中,所以在该方法中不能对UI中的控件进行操作 * 执行一些耗时较长的方法 */ @Override protected String doInBackground(Integer... params) { // TODO Auto-generated method stub NetOperator operator = new NetOperator(); int i = 0; for (i = 10; i < 100; i += 10) { operator.operator(); publishProgress(i); } return i + ""; } /** * 该方法运行在UI线程中实现对UI线程中的控件的一些操作 */ @Override protected void onPreExecute() { // TODO Auto-generated method stub // 设置控件可见 textView.setVisibility(View.VISIBLE); progressBar.setVisibility(View.VISIBLE); textView.setText("开始进行异步操作"); } /** * 该方法运行在UI线程中实现对UI线程中的控件的一些操作 */ @Override protected void onPostExecute(String result) { // TODO Auto-generated method stub textView.setText("异步操作结束" + result); progressBar.setVisibility(View.GONE); } /** * 1、该方法运行在UI线程中实现对UI线程中的控件的一些操作 * 2、在doInBackground方法中每次调用publishProgress都会触发这个方法的执行 */ @Override protected void onProgressUpdate(Integer... values) { // TODO Auto-generated method stub progressBar.setProgress(values[0]); } }
2、主界面Activity
package com.example.async2; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.ProgressBar; import android.widget.TextView; /** * 主界面,有TextView,ProgressBar和Button三个控件 * @author why * */ public class MainActivity extends Activity { private TextView textView = null; private ProgressBar progressBar = null; private Button button = null; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); // 设置布局文件 setContentView(R.layout.acttivity_main); // 通过ID获取控件 textView = (TextView) findViewById(R.id.textView); progressBar = (ProgressBar) findViewById(R.id.progressbar); button = (Button) findViewById(R.id.button1); // 给button绑定监听器 button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub ProgressBarAsyncTask task = new ProgressBarAsyncTask(textView, progressBar); task.execute(1000); } }); } }
3、NetOperator模拟执行时间较长的一些操作
package com.example.async2; /** * * @author why * */ public class NetOperator { public void operator() { try { // 将当前线程休眠,模拟执行时间较长的操作 Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
4、布局文件,很简单只有三个控件。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/textView" android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="gone" /> <ProgressBar android:id="@+id/progressbar" android:layout_width="match_parent" android:layout_height="wrap_content" style="?android:attr/progressBarStyleHorizontal" android:visibility="gone" /> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/button1" /> </LinearLayout>
推荐阅读