码迷,mamicode.com
首页 > 其他好文 > 详细

Andorid之Process and Threads

时间:2015-01-14 22:38:41      阅读:320      评论:0      收藏:0      [点我收藏+]

标签:

一:AsyncTask(框架)

An asynchronous task is defined by a computation that runs on a background thread and whose result is published on the UI thread. An asynchronous task is defined by 3 generic types, called Params, Progress and Result, and 4 steps, called onPreExecute, doInBackground, onProgressUpdate and onPostExecute.

  1. Params, the type of the parameters sent to the task upon execution. //输入参数
  2. Progress, the type of the progress units published during the background computation. //单元参数格式
  3. Result, the type of the result of the background computation.//返回参数

Not all types are always used by an asynchronous task. To mark a type as unused, simply use the type Void:

private class MyTask extends AsyncTask<Void, Void, Void> { ... }
package com.example.android_asynctask;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import com.example.android_asynctask.R.string;

import android.R.id;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Entity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.View.OnCreateContextMenuListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
    private Button button;
    private ImageView imageView;
    private ProgressDialog progressDialog;
    private final String image_path="http://www.baidu.com/img/bdlogo.gif";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button=(Button)this.findViewById(R.id.button1);
        imageView=(ImageView)this.findViewById(R.id.imageView1);
        progressDialog=new ProgressDialog(this);
        progressDialog.setTitle("提示!");
        progressDialog.setCancelable(false);
        progressDialog.setMessage("正在下载图片,请耐心等候~~~");
        button.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                new MyTast().execute(image_path);
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    class MyTast extends AsyncTask<String, Integer, byte[]>{

        @Override
        protected byte[] doInBackground(String... arg0) {
            // TODO Auto-generated method stub
            HttpClient httpClient=new DefaultHttpClient();
            HttpGet httpGet =new HttpGet(arg0[0]);
            byte[] result=null;
            try {
                HttpResponse httpResponse=httpClient.execute(httpGet);
                if(httpResponse.getStatusLine().getStatusCode()==200){
                    result=EntityUtils.toByteArray(httpResponse.getEntity());
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }finally{
                httpClient.getConnectionManager().shutdown();
            }
            return result;
        }
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            progressDialog.show();
        }
        //更新ui
        @Override
        protected void onPostExecute(byte[] result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            Bitmap bitmap=BitmapFactory.decodeByteArray(result, 0,result.length);
            imageView.setImageBitmap(bitmap);
            progressDialog.dismiss();
        }
    }
}

必须要添加访问授权<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.INTERNET"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.android_asynctask.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

跨线程更新UI的方法在onPostExecute中持行

onProgressUpdate使用AsyncTask的单元参数Progress

package com.example.android_asynctask;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;

import com.example.android_asynctask.R.string;

import android.R.id;
import android.R.integer;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.content.Entity;
import android.database.DatabaseUtils;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.view.Menu;
import android.view.View;
import android.view.View.OnCreateContextMenuListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.ImageView;

public class MainActivity extends Activity {
    private Button button;
    private ImageView imageView;
    private ProgressDialog progressDialog;
    private final String image_path="http://www.baidu.com/img/bdlogo.gif";
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button=(Button)this.findViewById(R.id.button1);
        imageView=(ImageView)this.findViewById(R.id.imageView1);
        progressDialog=new ProgressDialog(this);
        progressDialog.setTitle("提示!");
        progressDialog.setCancelable(false);
        progressDialog.setMessage("正在下载图片,请耐心等候~~~");
        progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        button.setOnClickListener(new View.OnClickListener() {
            
            @Override
            public void onClick(View arg0) {
                // TODO Auto-generated method stub
                new MyTast().execute(image_path);
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    class MyTast extends AsyncTask<String, Integer, byte[]>{

        @Override
        protected byte[] doInBackground(String... arg0) {
            // TODO Auto-generated method stub
            HttpClient httpClient=new DefaultHttpClient();
            HttpGet httpGet =new HttpGet(arg0[0]);
            byte[] result=null;//图片的所以内容
            InputStream inputStream =null;
            ByteArrayOutputStream outputStream=new ByteArrayOutputStream();
            try {
                HttpResponse httpResponse=httpClient.execute(httpGet);
                long file_length=httpResponse.getEntity().getContentLength();
                int total_length=0;
                byte[] data=new byte[1024];
                int len=0;
                if(httpResponse.getStatusLine().getStatusCode()==200){
                    //result=EntityUtils.toByteArray(httpResponse.getEntity());
                    inputStream=httpResponse.getEntity().getContent();
                    while ((len=inputStream.read(data))!=-1) {
                        total_length+=len;
                        int process_value=(int)((total_length/(float)file_length)*100);
                        publishProgress(process_value);//发布刻度单位
                        outputStream.write(data,0,len);
                    }
                }
                result=outputStream.toByteArray();
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }finally{
                httpClient.getConnectionManager().shutdown();
            }
            return result;
        }
        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            progressDialog.show();
        }
        //更新ui
        @Override
        protected void onPostExecute(byte[] result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            Bitmap bitmap=BitmapFactory.decodeByteArray(result, 0,result.length);
            imageView.setImageBitmap(bitmap);
            progressDialog.dismiss();
        }
        @Override
        protected void onProgressUpdate(Integer... values) {
            // TODO Auto-generated method stub
            super.onProgressUpdate(values);
            progressDialog.setProgress(values[0]);
        }
    }
}

Andorid之Process and Threads

标签:

原文地址:http://www.cnblogs.com/ilooking/p/4224963.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!