如果将比较费时的进程放在主进程中,那么会出现卡顿现象,给用户造成很不好的用户体验,用段代码来说明`
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 {
@Override
protected 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(){
上面代码按了按钮之后,那个按钮会出现一秒钟的延时(卡顿),给用户带来很不好的用户体验,这是我们需要把耗时的操作步放在线程中,即新建一个线程,new Thread,然后把好事操作放在该线程中,然后重写run()方法,调用start()方法,把上面onclick方法里面的内容换成下面的:
@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);
}
}
点击按钮后,按钮会被迅速弹起,说明主线程没有被阻塞,