Android线程相关编程
来源:互联网 发布:淘宝售前客服工作职责 编辑:程序博客网 时间:2024/05/17 05:52
定时每秒递增,向handler发送消息以刷新UI
注意:Handler所需导入的相关包为
android.os.Handler;
public class MainActivity extends AppCompatActivity { private Button button1, button2, button3; private TextView Tx1; private TextView Tx2; public Timer mTimer1; public TimerTask mTimerTask1; public Timer mTimer2; public TimerTask mTimerTask2; public int i=0; public int j=0; public boolean isTimer1Running=false; public boolean isTimer2Running=false; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1 = (Button) findViewById(R.id.button1); button2 = (Button) findViewById(R.id.button2); button3 = (Button) findViewById(R.id.button3); button1.setOnClickListener(new View.OnClickListener() {//启动或终止每秒+1的线程 @Override public void onClick(View view) {// Toast.makeText(getBaseContext(),"Button1",Toast.LENGTH_SHORT).show(); manager1();//处理函数1 } }); button2.setOnClickListener(new View.OnClickListener() {//启动或终止每秒+5的线程 @Override public void onClick(View view) {// Toast.makeText(getBaseContext(),"button2",Toast.LENGTH_SHORT).show(); manager2();//处理函数2 } }); button3.setOnClickListener(new View.OnClickListener() {//清零所有数值 @Override public void onClick(View view) { i=0; j=0; Toast.makeText(getBaseContext(),"清零",Toast.LENGTH_SHORT).show(); } }); } public void manager1(){//向handle1发送刷新UI的消息 isTimer1Running=!isTimer1Running; if(isTimer1Running) { mTimer1=new Timer(); mTimerTask1 = new TimerTask() { @Override public void run() { i++; Bundle b1 = new Bundle(); b1.putString("mes", Integer.toString(i)); Message msg = new Message(); msg.setData(b1); MainActivity.this.myHandler.sendMessage(msg); } }; mTimer1.schedule(mTimerTask1, 1000, 1000); Toast.makeText(getBaseContext(),"每秒+1线程启动",Toast.LENGTH_SHORT).show(); } else { mTimer1.cancel(); mTimerTask1.cancel(); Toast.makeText(getBaseContext(),"每秒+1线程终止",Toast.LENGTH_SHORT).show(); } } void manager2(){//向handle1发送刷新UI的消息 isTimer2Running=!isTimer2Running; if(isTimer2Running) { mTimer2 = new Timer(); mTimerTask2 = new TimerTask() { @Override public void run() { j += 50; Bundle b2 = new Bundle(); b2.putString("mes2", Integer.toString(j)); Message msg = new Message(); msg.setData(b2); MainActivity.this.myHandler.sendMessage(msg); } }; mTimer2.schedule(mTimerTask2, 1000, 1000); Toast.makeText(getBaseContext(),"每秒+50线程启动",Toast.LENGTH_SHORT).show(); } else{ mTimer2.cancel(); mTimerTask2.cancel(); Toast.makeText(getBaseContext(),"每秒+50线程终止",Toast.LENGTH_SHORT).show(); } } private final Handler myHandler=new Handler(){ @Override public void handleMessage(Message msg) {//收到消息后刷新UI界面 super.handleMessage(msg); Tx1=(TextView)findViewById(R.id.TX1); Tx2=(TextView) findViewById(R.id.TX2); Bundle b=msg.getData(); String mess=b.getString("mes"); if(mess!=null&&mess!="") Tx1.setText(mess); String mess2=b.getString("mes2"); if(mess2!=null&&mess2!="") Tx2.setText(mess2); } }; }
New Thread
public void onClick(View view) { new Thread(new Runnable(){ @Override public void run() { i++; Bundle b=new Bundle(); b.putString("mes1",Integer.toString(i)); Message m=new Message(); m.setData(b); MainActivity.this.myHandler.sendMessage(m);//向myHandler发送消息,以刷新UI } }).start();
AsyncTask
activity_main.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.xyz.test.MainActivity"> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="下载" android:id="@+id/download" android:layout_alignParentLeft="true" android:layout_alignParentStart="true" /> <android.support.v4.widget.ContentLoadingProgressBar android:id="@+id/pb" android:layout_below="@id/download" android:layout_width="match_parent" android:layout_height="wrap_content" style="?android:progressBarStyleHorizontal" /> <ImageView android:id="@+id/image" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/pb" /></RelativeLayout>
MainActivity.java
package com.example.xyz.test;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.view.View;import android.widget.Button;import android.widget.ImageView;import android.widget.ProgressBar;import android.widget.Toast;import org.apache.http.HttpResponse;import org.apache.http.client.HttpClient;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.DefaultHttpClient;import java.io.ByteArrayOutputStream;import java.io.InputStream;public class MainActivity extends AppCompatActivity { private Button download; public ImageView image; public ProgressBar pb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); download=(Button)findViewById(R.id.download); pb=(ProgressBar) findViewById(R.id.pb); image=(ImageView) findViewById(R.id.image); download.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { pb.setProgress(0);//进度条清零 DownLoad dt=new DownLoad();//每次调用都需要NEW一次 dt.execute("http://avatar.csdn.net/7/0/6/1_uyy203.jpg");//执行异步任务 } }); } class DownLoad extends AsyncTask<String,Integer,Bitmap> { Bitmap bm=null; byte[] data=new byte[1024]; @Override protected void onPreExecute() {//执行处理前执行的函数 super.onPreExecute(); image.setImageBitmap(null); pb.setProgress(0);//设置进度为0 } @Override protected Bitmap doInBackground(String... params) {//后台处理,主要完成耗时操作 publishProgress(0);//将会调用onProgressUpdate(Integer... progress)方法,并向其以整型的形式传递处理进度信息 ByteArrayOutputStream outputStream = new ByteArrayOutputStream();//字节输出流 InputStream inputStream=null;//字节输入流 try{ HttpClient httpClient=new DefaultHttpClient(); HttpGet httpGet=new HttpGet(params[0]);//获取图片 HttpResponse httpResponse=httpClient.execute(httpGet); if(httpResponse.getStatusLine().getStatusCode()==200){//判断响应是否有效 inputStream=httpResponse.getEntity().getContent(); long file_length=httpResponse.getEntity().getContentLength();//获取文件总长度 int len=0; int total_length=0;//已下载文件的长度 int value=0;//进度值 while ((len=inputStream.read(data))!=-1){//当输入流有数据即循环获取数据 total_length+=len; value=(int)((total_length/(float)file_length)*100);//计算下载进度 publishProgress(value);//传递进度值,并刷新UI outputStream.write(data,0,len);//将下载的数据放进输出流中 bm=BitmapFactory.decodeByteArray(outputStream.toByteArray(),0,outputStream.toByteArray().length);//将输出流字节转为Bitmap } } }catch (Exception e){ e.printStackTrace(); return null;//返回空值 } finally { if(inputStream!=null) try{ inputStream.close();//输入流关闭 }catch (Exception e){ e.printStackTrace(); } } return bm;//图片数据以Bitmap形式返回,以参数形式传入onPostExecute中,作后续处理 } @Override protected void onProgressUpdate(Integer... values) {//在调用publishProgress之后被调用,在ui线程执行 super.onProgressUpdate(values); pb.setProgress(values[0]);//更新UI进度条 } @Override protected void onPostExecute(Bitmap bitmap) {//在doInBackground执行后自动执行的处理函数,以参数的形式传入doInBackground的返回值 super.onPostExecute(bitmap); if(bitmap!=null){ Toast.makeText(MainActivity.this,"successed!",Toast.LENGTH_SHORT).show(); image.setImageBitmap(bitmap);//显示图片 } else { Toast.makeText(MainActivity.this,"failed!",Toast.LENGTH_SHORT).show(); } } protected void onCancelled () {//在ui线程执行 pb.setProgress(0);//进度条复位 } }}
AndroidManifest.xml
在<application></application>外 加入访问互联网权限
<uses-permission android:name="android.permission.INTERNET"/>
1 0
- Android线程相关编程
- Android线程,线程池相关
- Android线程相关
- Android线程相关
- android线程相关
- android线程相关
- Android线程相关_Handler_Message_AsyncTask
- android线程相关
- android线程相关
- Android 网络编程相关
- 1.Java线程基础-Android线程相关
- android 进程与线程 相关
- Android线程的相关使用
- Android ThreadPoolUtils-线程池相关
- android之多线程编程
- Android之多线程编程
- Android之多线程编程
- linux下的线程编程相关的
- 简单的hbase监控程序,用于监测hbase集群是否正常运行--66
- 有向图强连通分支
- 读hbase的region简单程序--67
- 有向图最小点基
- Windows游戏编程总结(一)图形处理中的几个函数
- Android线程相关编程
- Divide Two Integers
- 链表和数组(顺序表)&&LinkedList 和ArrayList
- MyEclipse安装SVN插件(一)
- MyEclipse与在线SVN(taocode)的使用(二)
- Android 中的数据存储----文件存储
- MyEclipse连接svn服务器出现错误--验证位置时发生错误(三)
- Android 中的数据存储----SharePreferences 存储
- BDAS图