当前位置:  编程技术>移动开发
本页文章导读:
    ▪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 


  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的作为异步处理线程.

    
[2] 多点抚摸放大图片的自定义listener
    来源: 互联网  发布时间: 2014-02-18
多点触摸放大图片的自定义listener
可以看到很多相册应用,通过两根手指的操作,能让图片放大缩小。很简单,通过自定义的继承于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

    
[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> 

    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
.net/c#/asp.net iis7站长之家
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3