当前位置: 编程技术>移动开发
本页文章导读:
▪andrid AsyncTask的施用 andrid AsyncTask的应用
看上去修改后的connect()方法已经可用了,但是这种匿名线程的方式是存在缺陷的:第一,线程的开销较大,如果每个任务都要创建一个线程,那么应用 程序的效率要低.........
▪ 多点抚摸放大图片的自定义listener 多点触摸放大图片的自定义listener
可以看到很多相册应用,通过两根手指的操作,能让图片放大缩小。很简单,通过自定义的继承于onTouchListener的类,去实现这样的效果。代码如下:
packag.........
▪ GridView根本构建Demo GridView基本构建Demo
Java代码 public class Main extends Activity implements OnItemSelectedListener, OnItemClickListener { private ImageView imageView; private int[] resIds = new int[] { R.drawable.item1.........
[1]andrid AsyncTask的施用
来源: 互联网 发布时间: 2014-02-18
andrid AsyncTask的应用
看上去修改后的connect()方法已经可用了,但是这种匿名线程的方式是存在缺陷的:第一,线程的开销较大,如果每个任务都要创建一个线程,那么应用 程序的效率要低很多;第二,线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。 另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。
为了解决这一问题,OPhone在1.5版本引入了AsyncTask。AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行, 这就有效地避免了使用Handler带来的麻烦。阅读AsyncTask的源码可知,AsyncTask是使用java.util.concurrent 框架来管理线程以及任务的执行的,concurrent框架是一个非常成熟,高效的框架,经过了严格的测试。这说明AsyncTask的设计很好的解决了 匿名线程存在的问题。
AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p) ,在此方法中实现任务的执行工作,比如连接网络获取数据等。通常还应该实现onPostExecute(Result r)方法,因为应用程序关心的结果在此方法中返回。需要注意的是AsyncTask一定要在主线程中创建实例。AsyncTask定义了三种泛型类型 Params,Progress和Result。
* Params 启动任务执行的输入参数,比如HTTP请求的URL。
* Progress 后台任务执行的百分比。
* Result 后台执行任务最终返回的结果,比如String。
AsyncTask 的执行分为四个步骤,与前面定义的TaskListener类似。每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用。
* onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。
* doInBackground(Params...) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress...)来更新任务的进度。
* onProgressUpdate(Progress...) 此方法在主线程执行,用于显示任务执行的进度。
* onPostExecute(Result) 此方法在主线程执行,任务执行的结果作为此方法的参数返回。
PageTask扩展了AsyncTask,在 doInBackground()方法中读取网页内容。PageTask的源代码如下所示:
// 设置三种类型参数分别为String,Integer,String
行PageTask非常简单,只需要调用如下代码。重新运行NetworkActivity,不但可以抓取网页的内容,还可以实时更新读取的进度。读者尝试读取一个较大的网页,看看百分比的更新情况。
1.PageTask task = new PageTask();
2.task.execute(url.getText().toString());
看上去修改后的connect()方法已经可用了,但是这种匿名线程的方式是存在缺陷的:第一,线程的开销较大,如果每个任务都要创建一个线程,那么应用 程序的效率要低很多;第二,线程无法管理,匿名线程创建并启动后就不受程序的控制了,如果有很多个请求发送,那么就会启动非常多的线程,系统将不堪重负。 另外,前面已经看到,在新线程中更新UI还必须要引入handler,这让代码看上去非常臃肿。
为了解决这一问题,OPhone在1.5版本引入了AsyncTask。AsyncTask的特点是任务在主线程之外运行,而回调方法是在主线程中执行, 这就有效地避免了使用Handler带来的麻烦。阅读AsyncTask的源码可知,AsyncTask是使用java.util.concurrent 框架来管理线程以及任务的执行的,concurrent框架是一个非常成熟,高效的框架,经过了严格的测试。这说明AsyncTask的设计很好的解决了 匿名线程存在的问题。
AsyncTask是抽象类,子类必须实现抽象方法doInBackground(Params... p) ,在此方法中实现任务的执行工作,比如连接网络获取数据等。通常还应该实现onPostExecute(Result r)方法,因为应用程序关心的结果在此方法中返回。需要注意的是AsyncTask一定要在主线程中创建实例。AsyncTask定义了三种泛型类型 Params,Progress和Result。
* Params 启动任务执行的输入参数,比如HTTP请求的URL。
* Progress 后台任务执行的百分比。
* Result 后台执行任务最终返回的结果,比如String。
AsyncTask 的执行分为四个步骤,与前面定义的TaskListener类似。每一步都对应一个回调方法,需要注意的是这些方法不应该由应用程序调用,开发者需要做的就是实现这些方法。在任务的执行过程中,这些方法被自动调用。
* onPreExecute() 当任务执行之前开始调用此方法,可以在这里显示进度对话框。
* doInBackground(Params...) 此方法在后台线程执行,完成任务的主要工作,通常需要较长的时间。在执行过程中可以调用publicProgress(Progress...)来更新任务的进度。
* onProgressUpdate(Progress...) 此方法在主线程执行,用于显示任务执行的进度。
* onPostExecute(Result) 此方法在主线程执行,任务执行的结果作为此方法的参数返回。
PageTask扩展了AsyncTask,在 doInBackground()方法中读取网页内容。PageTask的源代码如下所示:
// 设置三种类型参数分别为String,Integer,String
class PageTask extends AsyncTask<String, Integer, String> { // 可变长的输入参数,与AsyncTask.exucute()对应 @Override protected String doInBackground(String... params) { try { HttpClient client = new DefaultHttpClient(); // params[0] 代表连接的url HttpGet get = new HttpGet(params[0]); HttpResponse response = client.execute(get); HttpEntity entity = response.getEntity(); long length = entity.getContentLength(); InputStream is = entity.getContent(); String s = null; if (is != null) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buf = new byte[128]; int ch = -1; int count = 0; while ((ch = is.read(buf)) != -1) { baos.write(buf, 0, ch); count += ch; if (length > 0) { // 如果知道响应的长度,调用publishProgress()更新进度 publishProgress((int) ((count / (float) length) * 100)); } // 为了在模拟器中清楚地看到进度,让线程休眠100ms Thread.sleep(100); } s = new String(baos.toByteArray()); } // 返回结果 return s; } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onCancelled() { super.onCancelled(); } @Override protected void onPostExecute(String result) { // 返回HTML页面的内容 message.setText(result); } @Override protected void onPreExecute() { // 任务启动,可以在这里显示一个对话框,这里简单处理 message.setText(R.string.task_started); } @Override protected void onProgressUpdate(Integer... values) { // 更新进度 message.setText(values[0]); } }
行PageTask非常简单,只需要调用如下代码。重新运行NetworkActivity,不但可以抓取网页的内容,还可以实时更新读取的进度。读者尝试读取一个较大的网页,看看百分比的更新情况。
1.PageTask task = new PageTask();
2.task.execute(url.getText().toString());
1 楼
carlosk
2011-12-12
这种方法依然是在一个activity里执行异步操作,进入这个activity的时候创建线程,退出或者跳到其他activity的时候,这个线程会销毁.
创建和销毁所带来的消耗也很大.
其实最好的做法是自己写一个循环的线程,专门整个app的作为异步处理线程.
创建和销毁所带来的消耗也很大.
其实最好的做法是自己写一个循环的线程,专门整个app的作为异步处理线程.
[2] 多点抚摸放大图片的自定义listener
来源: 互联网 发布时间: 2014-02-18
多点触摸放大图片的自定义listener
可以看到很多相册应用,通过两根手指的操作,能让图片放大缩小。很简单,通过自定义的继承于onTouchListener的类,去实现这样的效果。代码如下:
可以看到很多相册应用,通过两根手指的操作,能让图片放大缩小。很简单,通过自定义的继承于onTouchListener的类,去实现这样的效果。代码如下:
package cn.test; import android.graphics.Matrix; import android.graphics.PointF; import android.util.FloatMath; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.widget.ImageView; import android.widget.ImageView.ScaleType; public class MulitPointTouchListener implements OnTouchListener { // These matrices will be used to move and zoom image Matrix matrix = new Matrix(); Matrix savedMatrix = new Matrix(); public ImageView image; // We can be in one of these 3 states static final int NONE = 0; static final int DRAG = 1; static final int ZOOM = 2; int mode = NONE; // Remember some things for zooming PointF start = new PointF(); PointF mid = new PointF(); float oldDist = 1f; public MulitPointTouchListener(ImageView image) { super(); this.image = image; } @Override public boolean onTouch(View v, MotionEvent event) { this.image.setScaleType(ScaleType.MATRIX); ImageView view = (ImageView) v; // Log.e("view_width", // view.getImageMatrix()..toString()+"*"+v.getWidth()); // Dump touch event to log dumpEvent(event); // Handle touch events here... switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: matrix.set(view.getImageMatrix()); savedMatrix.set(matrix); start.set(event.getX(), event.getY()); //Log.d(TAG, "mode=DRAG"); mode = DRAG; /* * float scaleWidth=180f/320; float scaleHeight=240f/480; * matrix.reset(); matrix.postScale(scaleWidth, scaleHeight); */ //Log.d(TAG, "mode=NONE"); break; case MotionEvent.ACTION_POINTER_DOWN: oldDist = spacing(event); //Log.d(TAG, "oldDist=" + oldDist); if (oldDist > 10f) { savedMatrix.set(matrix); midPoint(mid, event); mode = ZOOM; //Log.d(TAG, "mode=ZOOM"); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_POINTER_UP: mode = NONE; //Log.e("view.getWidth", view.getWidth() + ""); //Log.e("view.getHeight", view.getHeight() + ""); break; case MotionEvent.ACTION_MOVE: if (mode == DRAG) { // ... matrix.set(savedMatrix); matrix.postTranslate(event.getX() - start.x, event.getY() - start.y); } else if (mode == ZOOM) { float newDist = spacing(event); //Log.d(TAG, "newDist=" + newDist); if (newDist > 10f) { matrix.set(savedMatrix); float scale = newDist / oldDist; matrix.postScale(scale, scale, mid.x, mid.y); } } break; } view.setImageMatrix(matrix); return true; // indicate event was handled } private void dumpEvent(MotionEvent event) { String names[] = { "DOWN", "UP", "MOVE", "CANCEL", "OUTSIDE", "POINTER_DOWN", "POINTER_UP", "7?", "8?", "9?" }; StringBuilder sb = new StringBuilder(); int action = event.getAction(); int actionCode = action & MotionEvent.ACTION_MASK; sb.append("event ACTION_").append(names[actionCode]); if (actionCode == MotionEvent.ACTION_POINTER_DOWN || actionCode == MotionEvent.ACTION_POINTER_UP) { sb.append("(pid ").append( action >> MotionEvent.ACTION_POINTER_ID_SHIFT); sb.append(")"); } sb.append("["); for (int i = 0; i < event.getPointerCount(); i++) { sb.append("#").append(i); sb.append("(pid ").append(event.getPointerId(i)); sb.append(")=").append((int) event.getX(i)); sb.append(",").append((int) event.getY(i)); if (i + 1 < event.getPointerCount()) sb.append(";"); } sb.append("]"); //Log.d(TAG, sb.toString()); } /** Determine the space between the first two fingers */ private float spacing(MotionEvent event) { float x = event.getX(0) - event.getX(1); float y = event.getY(0) - event.getY(1); return FloatMath.sqrt(x * x + y * y); } /** Calculate the mid point of the first two fingers */ private void midPoint(PointF point, MotionEvent event) { float x = event.getX(0) + event.getX(1); float y = event.getY(0) + event.getY(1); point.set(x / 2, y / 2); } }
1 楼
xunhuan01
2012-04-11
view.getImageMatrix(), savedMatrix.set(matrix); 这两句是什么意思?
为什么是event.getx()-start.x,event.gety()-start.y
为什么是event.getx()-start.x,event.gety()-start.y
[3] GridView根本构建Demo
来源: 互联网 发布时间: 2014-02-18
GridView基本构建Demo
Java代码
public class Main extends Activity implements OnItemSelectedListener,
OnItemClickListener {
private ImageView imageView;
private int[] resIds = new int[] { R.drawable.item1, R.drawable.item2,
R.drawable.item3, R.drawable.item4, R.drawable.item5,
R.drawable.item6, R.drawable.item7, R.drawable.item8,
R.drawable.item9, R.drawable.item10, R.drawable.item11,
R.drawable.item12, R.drawable.item13, R.drawable.item14,
R.drawable.item15 };
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
long id) {
imageView.setImageResource(resIds[position]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
imageView.setImageResource(resIds[position]);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridView = (GridView) findViewById(R.id.gridview);
List<Map<String, Object>> cells = new ArrayList<Map<String, Object>>();
for (int i = 0; i < resIds.length; i++) {
Map<String, Object> cell = new HashMap<String, Object>();
cell.put("imageview", resIds[i]);
cells.add(cell);
}
SimpleAdapter simpleAdapter = new SimpleAdapter(this, cells,
R.layout.cell, new String[] { "imageview" },
new int[] { R.id.imageview });
gridView.setAdapter(simpleAdapter);
imageView = (ImageView) findViewById(R.id.imageview);
gridView.setOnItemSelectedListener(this);
gridView.setOnItemClickListener(this);
imageView.setImageResource(resIds[0]);
}
}
public class Main extends Activity implements OnItemSelectedListener,
OnItemClickListener {
private ImageView imageView;
private int[] resIds = new int[] { R.drawable.item1, R.drawable.item2,
R.drawable.item3, R.drawable.item4, R.drawable.item5,
R.drawable.item6, R.drawable.item7, R.drawable.item8,
R.drawable.item9, R.drawable.item10, R.drawable.item11,
R.drawable.item12, R.drawable.item13, R.drawable.item14,
R.drawable.item15 };
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
long id) {
imageView.setImageResource(resIds[position]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
imageView.setImageResource(resIds[position]);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridView = (GridView) findViewById(R.id.gridview);
List<Map<String, Object>> cells = new ArrayList<Map<String, Object>>();
for (int i = 0; i < resIds.length; i++) {
Map<String, Object> cell = new HashMap<String, Object>();
cell.put("imageview", resIds[i]);
cells.add(cell);
}
SimpleAdapter simpleAdapter = new SimpleAdapter(this, cells,
R.layout.cell, new String[] { "imageview" },
new int[] { R.id.imageview });
gridView.setAdapter(simpleAdapter);
imageView = (ImageView) findViewById(R.id.imageview);
gridView.setOnItemSelectedListener(this);
gridView.setOnItemClickListener(this);
imageView.setImageResource(resIds[0]);
}
}
main.xml:
Java代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:gravity="center_horizontal">
<GridView android:id="@+id/gridview" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:numColumns="5"
android:padding="20dp" android:horizontalSpacing="6dp"
android:verticalSpacing="6dp" />
<ImageView android:id="@+id/imageview" android:layout_width="fill_parent"
android:layout_height="200dp" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:gravity="center_horizontal">
<GridView android:id="@+id/gridview" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:numColumns="5"
android:padding="20dp" android:horizontalSpacing="6dp"
android:verticalSpacing="6dp" />
<ImageView android:id="@+id/imageview" android:layout_width="fill_parent"
android:layout_height="200dp" />
</LinearLayout>
cell.xml:
Java代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView android:id="@+id/imageview" android:layout_width="48dp"
android:layout_height="48dp" />
</LinearLayout>
Java代码
public class Main extends Activity implements OnItemSelectedListener,
OnItemClickListener {
private ImageView imageView;
private int[] resIds = new int[] { R.drawable.item1, R.drawable.item2,
R.drawable.item3, R.drawable.item4, R.drawable.item5,
R.drawable.item6, R.drawable.item7, R.drawable.item8,
R.drawable.item9, R.drawable.item10, R.drawable.item11,
R.drawable.item12, R.drawable.item13, R.drawable.item14,
R.drawable.item15 };
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
long id) {
imageView.setImageResource(resIds[position]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
imageView.setImageResource(resIds[position]);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridView = (GridView) findViewById(R.id.gridview);
List<Map<String, Object>> cells = new ArrayList<Map<String, Object>>();
for (int i = 0; i < resIds.length; i++) {
Map<String, Object> cell = new HashMap<String, Object>();
cell.put("imageview", resIds[i]);
cells.add(cell);
}
SimpleAdapter simpleAdapter = new SimpleAdapter(this, cells,
R.layout.cell, new String[] { "imageview" },
new int[] { R.id.imageview });
gridView.setAdapter(simpleAdapter);
imageView = (ImageView) findViewById(R.id.imageview);
gridView.setOnItemSelectedListener(this);
gridView.setOnItemClickListener(this);
imageView.setImageResource(resIds[0]);
}
}
public class Main extends Activity implements OnItemSelectedListener,
OnItemClickListener {
private ImageView imageView;
private int[] resIds = new int[] { R.drawable.item1, R.drawable.item2,
R.drawable.item3, R.drawable.item4, R.drawable.item5,
R.drawable.item6, R.drawable.item7, R.drawable.item8,
R.drawable.item9, R.drawable.item10, R.drawable.item11,
R.drawable.item12, R.drawable.item13, R.drawable.item14,
R.drawable.item15 };
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position,
long id) {
imageView.setImageResource(resIds[position]);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
imageView.setImageResource(resIds[position]);
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
GridView gridView = (GridView) findViewById(R.id.gridview);
List<Map<String, Object>> cells = new ArrayList<Map<String, Object>>();
for (int i = 0; i < resIds.length; i++) {
Map<String, Object> cell = new HashMap<String, Object>();
cell.put("imageview", resIds[i]);
cells.add(cell);
}
SimpleAdapter simpleAdapter = new SimpleAdapter(this, cells,
R.layout.cell, new String[] { "imageview" },
new int[] { R.id.imageview });
gridView.setAdapter(simpleAdapter);
imageView = (ImageView) findViewById(R.id.imageview);
gridView.setOnItemSelectedListener(this);
gridView.setOnItemClickListener(this);
imageView.setImageResource(resIds[0]);
}
}
main.xml:
Java代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:gravity="center_horizontal">
<GridView android:id="@+id/gridview" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:numColumns="5"
android:padding="20dp" android:horizontalSpacing="6dp"
android:verticalSpacing="6dp" />
<ImageView android:id="@+id/imageview" android:layout_width="fill_parent"
android:layout_height="200dp" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:gravity="center_horizontal">
<GridView android:id="@+id/gridview" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:numColumns="5"
android:padding="20dp" android:horizontalSpacing="6dp"
android:verticalSpacing="6dp" />
<ImageView android:id="@+id/imageview" android:layout_width="fill_parent"
android:layout_height="200dp" />
</LinearLayout>
cell.xml:
Java代码
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView android:id="@+id/imageview" android:layout_width="48dp"
android:layout_height="48dp" />
</LinearLayout>
最新技术文章: