android异步任务处理

来源:互联网 发布:mac有什么好用的软件 编辑:程序博客网 时间:2024/05/20 02:21

如果将比较费时的进程放在主进程中,那么会出现卡顿现象,给用户造成很不好的用户体验,用段代码来说明`
package com.example.testthread;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;

public class MainActivity extends Activity {

@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    findViewById(R.id.button1).setOnClickListener(new OnClickListener() {        @Override        public void onClick(View v) {            // TODO Auto-generated method stub            try {                Thread.sleep(2000);//延时,造成主线程阻塞                System.out.println(">>>>>卡顿<<<<<<");            } catch (InterruptedException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    });}

}

上面代码按了按钮之后,那个按钮会出现一秒钟的延时(卡顿),给用户带来很不好的用户体验,这是我们需要把耗时的操作步放在线程中,即新建一个线程,new Thread,然后把好事操作放在该线程中,然后重写run()方法,调用start()方法,把上面onclick方法里面的内容换成下面的:
new Thread(){

                @Override                public void run() {                    // TODO Auto-generated method stub                    super.run();                    try {                        Thread.sleep(2000);                        System.out.println(">>>>>>...cccc");                    } catch (InterruptedException e) {                        // TODO Auto-generated catch block                        e.printStackTrace();                    }                }        }.start();`

此时我们再按按钮,会发现马上就会弹起来,不会出现一秒的延时。

android还提供了一个异步操作类ASyncTask,用个小例子来解释
布局文件如下`

package com.example.usingasynctask;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.MalformedURLException;import java.net.URL;import java.net.URLConnection;import android.app.Activity;import android.os.AsyncTask;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.OnClickListener;import android.widget.TextView;public class MainActivity extends Activity {    TextView textView ;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        textView = (TextView) findViewById(R.id.textview);        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                // TODO Auto-generated method stub                ReadURL("http://www.baidu.com");            }        });    }    private void ReadURL(String url) {        // TODO Auto-generated method stub        new AsyncTask<String, Void, String>() {            @Override            protected String doInBackground(String... params) {                try {                    URL url = new URL(params[0]);                    URLConnection connection = url.openConnection();//获取当前的网络连接                    InputStream istream = connection.getInputStream();                    InputStreamReader isr = new InputStreamReader(istream);                    BufferedReader br = new BufferedReader(isr);                    String line;                    StreamBuilder builder= new StreamBuilder();                    while((line = br.readline()) != null){                    builder.append(line);                    }                    br.close();                    istream.close();                    return builder.toString();                } catch (MalformedURLException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                } catch (IOException e) {                    // TODO Auto-generated catch block                    e.printStackTrace();                }                return null;            }            @Override            protected void onCancelled() {                // TODO Auto-generated method stub                super.onCancelled();            }            @Override            protected void onCancelled(String result) {                // TODO Auto-generated method stub                super.onCancelled(result);            }            @Override            protected void onPostExecute(String result) {                textView.setText(result);                super.onPostExecute(result);            }            @Override            protected void onPreExecute() {                // TODO Auto-generated method stub                super.onPreExecute();            }            @Override            protected void onProgressUpdate(Void... values) {                // TODO Auto-generated method stub                super.onProgressUpdate(values);            }        }.execute(url);    }}

点击按钮后,按钮会被迅速弹起,说明主线程没有被阻塞,

0 0
原创粉丝点击