android中的几种多线程实现方式:
1)Activity.runOnUiThread(Runnable)
2)View.post(Runnable) ;View.postDelay(Runnable , long)
3)Handler
4)AsyncTask
介绍AsyncTask写法
用异步任务架构多任务模型其实也不是很健壮,得创建多个AsyncTask实例。一个AsyncTask仅执行一次,不能重复执行,快餐类的线程,一次用完。
实现AsyncTask子类,最重要的两个方法,一个是doInBackground(params);一个是onPostExecute(result)。在doInBackground()方法里处理耗时事务,并把结果返回,返回的值将在onPostExecute方法作为参数,然后就可以在onPostExecute()把结果展示在ui上面了。
步骤:
①实例化AsyncTask:
实例化AsyncTask然后通过task.exec(pamas);传进去参数,这个参数列表是动态的,可以是一个也可以使多个,长度可变。
AsyncTask<params,values,reslut>,第一个参数会传进去这个方法doInBackground(params),第二个参数是数据更新的值,第三个是处理事务返回的结果。
②onPreExecute方法:
这个方法没有参数,也没有返回值,可以在这个方法里,做一些提醒。比如show一个Dialog,或者弹个Toast告诉用户开始下载啦。
③doInBackground(params)方法:
进入AsyncTask内部结构,首先将执行reslut doInBackground(params)方法,这个方法将处理耗时事务,exec()的参数将会传进这个方法做参数,而返回值将会作为onPostExecute()的参数。如果要更新进度的话,需执行publicProgress()方法。
④onProgressUpdate(values)方法:
这个方法的参数必须在doInBackground()方法里执行publicProgress()方法,这个方法将会把参数传递进onProgressUpdate()方法里,然后可以在这个方法做一些ui上的更新展示,比如进度条的值就可以通过这个values值动态改变。
⑤onPostExecute(result)方法:
这里就是事务处理完毕的走的方法,doInBackground方法执行的结果将传到这里,如果这个方法返回了数据。在这个方法里可以处理Ui,可以把处理完的数据展示在ui上。比如图片啊,文字啊,一切你想要的结果。
案列
1、添加android项目文件
2、添加类继承AsyncTask,项目文件如下
用listview显示数据
3、添加布局文件,布局如下
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.multithreadind01.MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_alignTop="@+id/textView1" android:layout_marginRight="53dp" android:text="Button" /> <ListView android:id="@+id/listView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/button1" android:layout_marginTop="84dp" > </ListView> <ProgressBar android:id="@+id/progressBar1" style="?android:attr/progressBarStyleHorizontal" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignLeft="@+id/listView1" android:layout_alignRight="@+id/button1" android:layout_below="@+id/button1" android:layout_marginTop="28dp" /> </RelativeLayout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <TextView android:id="@+id/username" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="60dp" android:textSize="45dp" /> <TextView android:id="@+id/sex" android:layout_weight="1" android:layout_width="match_parent" android:layout_height="60dp" android:textSize="45dp" /> </LinearLayout>
MainActivity类代码:绑定数据
public class MainActivity extends Activity { private String fromDb_str1 = ""; private Button btn; private TextView tv; private ListView lv; private BaseAdapter adapter; private List<User> userList = new ArrayList<User>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); for (int i = 0; i < 5; i++) { User u = new User(); u.setUsername("小明"+i); u.setSex("女"+i); userList.add(u); } tv =(TextView)findViewById(R.id.textView1); btn =(Button)findViewById(R.id.button1); btn.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { MyTask mt = new MyTask(MainActivity.this); mt.execute(userList,adapter);//里面的参数是传给doInBackground /* Thread t1 = new Thread(new Runnable() { @Override public void run() { fromDb_str1 = "测试"; } }); t1.start(); tv.setText(fromDb_str1); */ } }); adapter = new BaseAdapter(){ @Override public int getCount() { // TODO Auto-generated method stub return userList.size(); } @Override public View getView(int position, View convertView, ViewGroup parent) { LayoutInflater inflater = MainActivity.this.getLayoutInflater(); View view; if (convertView==null){ view = inflater.inflate(R.layout.item, null); } else{ view = convertView; } TextView tv_username = (TextView)view.findViewById(R.id.username); TextView tv_sex = (TextView)view.findViewById(R.id.sex); tv_username.setText(userList.get(position).getUsername()); tv_sex.setText(userList.get(position).getSex()); return view; } @Override public Object getItem(int position) { // TODO Auto-generated method stub return null; } @Override public long getItemId(int position) { // TODO Auto-generated method stub return 0; } }; lv = (ListView)findViewById(R.id.listView1); lv.setAdapter(adapter); } }
MyTask类,应用多线程,显示数据
package com.example.multithreadind01; import java.util.List; import android.os.AsyncTask; import android.view.View; import android.widget.BaseAdapter; import android.widget.ProgressBar; import android.widget.TextView; import android.widget.Toast; public class MyTask extends AsyncTask { private BaseAdapter adapter; private List<User> userList; private MainActivity activity; public MyTask(MainActivity activity){ this.activity = activity; } //1.所有耗时的代码,写到这里来(数据库、蓝牙、网络服务) //2.绝对不能碰UI @Override protected Object doInBackground(Object... params) { userList = (List<User>) params[0]; adapter = (BaseAdapter) params[1]; for (int i = 0; i < userList.size(); i++) { try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } userList.get(i).setUsername("小红"+i); userList.get(i).setSex("男"+i); publishProgress(i); } //userlist,adapter //返回给前端 return "天气:22度"; } //准备 @Override protected void onPreExecute() { Toast.makeText(activity, "今晚不错啊", Toast.LENGTH_SHORT).show(); } //做完后执行 @Override protected void onPostExecute(Object result) { String r = result.toString(); TextView tv = (TextView)activity.findViewById(R.id.textView1); tv.setText("访问完成!"+r); } //分步完成 @Override protected void onProgressUpdate(Object... values) { // TODO Auto-generated method stub //0,1,2,3,4 int bar = Integer.parseInt(values[0].toString()); bar = (bar+1)*20; ProgressBar progressBar = (ProgressBar)activity.findViewById(R.id.progressBar1); progressBar.setProgress(bar); adapter.notifyDataSetChanged(); } }
效果图:开始界面,进行中,完成时
写安卓项目,我们应该一步一步来,一个功能一个功能去测试,而不是写完全部再去测试,这样出错误的话,找错误都不知道怎么找,应该稳打稳扎,
错误才好找,效率才会高。