zoukankan      html  css  js  c++  java
  • android开发--多线程

    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();
        }
    
    }

      效果图:开始界面,进行中,完成时

                   

        写安卓项目,我们应该一步一步来,一个功能一个功能去测试,而不是写完全部再去测试,这样出错误的话,找错误都不知道怎么找,应该稳打稳扎,

        错误才好找,效率才会高。

      

  • 相关阅读:
    git 简单操作
    JS中substr与substring的区别
    手写map, filter函数
    node之pipe
    nodejs之child_process
    node真的是单线程模式吗
    【xinsir】分享一个查找文件的脚手架
    【xinsir】函数库,持续更新
    数组循环方法统计
    20190916
  • 原文地址:https://www.cnblogs.com/yuluo123/p/6135282.html
Copyright © 2011-2022 走看看