问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Android开发中如何提升页面渲染速度

发布网友 发布时间:2022-05-27 21:19

我来回答

1个回答

热心网友 时间:2024-12-05 16:57

在开发工程中线程可以帮助我们提高运行速度,Android开发中我知道的线程有四个一个是老生长谈的Thread,第二个是asyncTask,第三个:TimetTask,第四个是Looper,四个多线程各有个的有点,Thread的运行速度是最快的,AsyncTask的规范性是最棒的,其它两个也有自己的优点,下面先贴上三个列子
1.Thread与Handler组合,比较常见
Handler主要是帮助我们来时时更新UI线程
这里在后天加载100张图片,然后没加载完成一个用handler 返回给UI线程一张图片并显示
最后加载完成返回一个List给UI线程 ,Handler就是一个后台线程与UI线程中间的桥梁

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110

package com.android.wei.thread;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class Activity01 extends Activity {
/** Called when the activity is first created. */

/**读取进度**/
public final static int LOAD_PROGRESS =0;

/**标志读取进度结束**/
public final static int LOAD_COMPLETE = 1;
/**开始加载100张图片按钮**/
Button mButton = null;

/**显示内容**/
TextView mTextView = null;

/**加载图片前的时间**/
Long mLoadStart = 0L;
/**加载图片完成的时间**/
Long mLoadEndt = 0L;

Context mContext = null;
/**图片列表**/
private List<Bitmap> list;
/**图片容器**/
private ImageView mImageView;
//接受传过来得消息
Handler handler = new Handler(){
public void handleMessage(Message msg){
switch(msg.what){
case LOAD_PROGRESS:
Bitmap bitmap = (Bitmap)msg.obj;
mTextView.setText("当前读取到第"+msg.arg1+"张图片");
mImageView.setImageBitmap(bitmap);
break;
case LOAD_COMPLETE:
list = (List<Bitmap>) msg.obj;
mTextView.setText("读取结束一共加载"+list.size()+"图片");
break;
}
super.handleMessage(msg);
}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mContext = this;
setContentView(R.layout.main);
mButton =(Button) findViewById(R.id.button1);
mTextView=(TextView) findViewById(R.id.textView1);
mImageView =(ImageView) this.findViewById(R.id.imageview);
mTextView.setText("点击按钮加载图片");
mButton.setOnClickListener(new OnClickListener(){
public void onClick(View v){
//调用方法
LoadImage();
}
});

}
public void LoadImage(){
new Thread(){
public void run(){
mLoadStart = System.currentTimeMillis();
List<Bitmap> list = new ArrayList<Bitmap>();
for(int i =0;i<100;i++){
Bitmap bitmap=ReadBitmap(mContext,R.drawable.icon);
Message msg = new Message();
msg.what = LOAD_PROGRESS;
msg.arg1 = i+1;
list.add(bitmap);
msg.obj = bitmap;
handler.sendMessage(msg);
}
mLoadEndt = System.currentTimeMillis();
Message msg = new Message();
msg.what = LOAD_COMPLETE;
msg.obj=list;
msg.arg1 = (int) (mLoadEndt - mLoadStart);
handler.sendMessage(msg);

}
}.start();
}
public Bitmap ReadBitmap(Context context,int resId){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is, null, opt);
}
}

2AsyncTask异步多线程

AsyncTask的规范型很强,能够时时反映更新的情况
它一般有这么几个方法

* onPreExecute(), 该方法将在执行实际的后台操作前被UI 线程调用。可以在该方法中做一些准备工作,如在界面上显示一个进度条,或者一些控件的实例化,这个方法可以不用实现。
* doInBackground(Params...), 将在onPreExecute 方法执行后马上执行,该方法运行在后台线程中。这里将主要负责执行那些很耗时的后台处理工作。可以调用 publishProgress方法来更新实时的任务进度。该方法是抽象方法,子类必须实现。
* onProgressUpdate(Progress...),在publishProgress方法被调用后,UI 线程将调用这个方法从而在界面上展示任务的进展情况,例如通过一个进度条进行展示。
* onPostExecute(Result), 在doInBackground 执行完成后,onPostExecute 方法将被UI 线程调用,后台的计算结果将通过该方法传递到UI 线程,并且在界面上展示给用户.
* onCancelled(),在用户取消线程操作的时候调用。在主线程中调用onCancelled()的时候调用。
为了正确的使用AsyncTask类,以下是几条必须遵守的准则:
1) Task的实例必须在UI 线程中创建
2) execute方法必须在UI 线程中调用
3) 不要手动的调用onPreExecute(), onPostExecute(Result),doInBackground(Params...), onProgressUpdate(Progress...)这几个方法,需要在UI线程中实例化这个task来调用。
4) 该task只能被执行一次,否则多次调用时将会出现异常

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115

package com.android.wei.thread;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

public class Activity02 extends Activity{

/**开始StartAsync按钮**/
Button mButton = null;

Context mContext = null;

//内容显示出来
TextView mTextView = null;

//Timer 对象
Timer mTimer = null;

/** timerTask 对象**/
TimerTask mTimerTask = null;

/**记录TimerId**/
int mTimerId =0;
/**图片列表**/
private List<Bitmap> list;
/**图片容器**/
private ImageView mImageView;
public void onCreate(Bundle s){
super.onCreate(s);
setContentView(R.layout.main);
mContext = this;
mButton =(Button) this.findViewById(R.id.button1);
mImageView =(ImageView)this.findViewById(R.id.imageview);
mTextView =(TextView) this.findViewById(R.id.textView1);
mButton.setOnClickListener(new OnClickListener(){
public void onClick(View v){
StartAsync();
}
});

}
public void StartAsync(){
new AsyncTask<Object,Object,Object>(){
protected void onPreExecute(){
//首先执行这个方法,它在UI线程中,可以执行一些异步操作
mTextView.setText("开始加载进度");
super.onPreExecute();
}
@Override
protected Object doInBackground(Object... params) {
// TODO Auto-generated method stub
//异步后台执行,执行完毕可以返回出去一个结果 Object 对象
//得到开始加载得时间
list = new ArrayList<Bitmap>();
for(int i =0;i<100;i++){
Bitmap bitmap =ReadBitmap(mContext,R.drawable.icon);
final ByteArrayOutputStream os = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 100, os);
byte[] image = os.toByteArray();
Bundle bundle = new Bundle();
bundle.putInt("index", i);
bundle.putByteArray("image", image);
publishProgress(bundle);
list.add(bitmap);

}

return list;
}
protected void onPostExecute(Object result){
//doInBackground 执行之后在这里可以接受到返回结果的对象
List<Bitmap> list = (List<Bitmap>) result;
mTextView.setText("一共加载了"+list.size()+"张图片");
super.onPostExecute(result);
}
protected void onProgressUpdate(Object... values){
//时时拿到当前的进度更新UI
Bundle bundle = (Bundle)values[0];
byte[] image = bundle.getByteArray("image");
Bitmap bitmap = BitmapFactory.decodeByteArray(image, 0, image.length);
int index = bundle.getInt("index");
mTextView.setText("当前加载进度"+index);
mImageView.setImageBitmap(bitmap);
super.onProgressUpdate(values);
}

}.execute();
}
public Bitmap ReadBitmap(Context context,int resId){
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inPreferredConfig = Bitmap.Config.RGB_565;
opt.inPurgeable = true;
opt.inInputShareable = true;
InputStream is = context.getResources().openRawResource(resId);
return BitmapFactory.decodeStream(is, null, opt);
}

}

3TimerTask

可以根据我们的设置来间隔性的运行,可以很好的实现监听功能一般也跟handler一起

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

package com.android.wei.thread;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class TimerTaskActivity extends Activity{
/**执行Timer进度**/
public final static int LOAD_PROGRESS =0;

/**关闭TImer进度**/
public final static int CLOSE_PROGRESS =1;

http://my.oschina.net/antkingwei/blog/48698追问我想知道的是 。就是 我从服务器加载数据,已经loadsuccess,但是 数据没有在界面上显示(比如listView),要过一会 才会显示出来。

追答逐个查找

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
Request对象语法 9,django中request对象 塞尔达传说时之笛火之神殿Boss房间怎么去 ...的圆形地方怎么上去?打完BOSS后才发现没去过,但我 榆中兴隆山旅游路线 ...兴隆山校区到哪个公交车站最近?应该怎么乘公交车?打车的话得多少钱... 从般若寺到兴隆山法院怎么坐公交车,最快需要多久 那些属于国有经济,哪些属于集体经济 ...丢手机,生病,丢工作,怎么转运啊,谁能告诉我,我快疯了 阴历十月又叫什么月 前门牙跌跤断了一半,是上牙套接上好,还是 重新种一颗好 求唐嫣男人装和性感高清大图,谢谢! 央视一套08年黄金档播出了那几部电视剧 11岁生日祝福语 11岁男孩过生日祝福语 唐嫣在穿搭上有哪些过人之处? 四岁儿童意外把门牙磕断了一半,换牙有影响吗?需要补牙吗?请专业人士... ...我八月底不小心把门牙摔掉了两颗,一颗掉了一半一颗掉了一个角... 11岁简单生日祝福语 为什么要拍“阿丕书记”这不电视剧? 阿丕书记的幕后花絮 电视剧阿丕书记演员表 阿丕书记的剧集评价 阿丕书记的介绍 哪里可以买到原装的诺基亚手机配件 灵魂认出了你 前世情缘未了 今世又等了那么久 你若也认出了就相认... 灵魂让我认出了你,所以一眼万年。出自何处 什么样的果蔬面膜可以有比较好的淡化色斑的效果? 违章查询皖kL2L28怎去查询 蔬菜面条有什么营养 两颗门牙断了一半,如何修补_补牙 11岁女孩生日祝词 11岁男孩生日祝福语 11岁生日祝福语简短明了 安装虚拟机 Microsoft Runtime DLL安装未能完成什么原因 VMware 12.0 在安装的时候出现 microsoft runtime dll 安装虚拟机时出现The Microsoft Runtime DLL installer failed to... 安装虚拟机出现“”microsoft runtime dll 安装程序未能安装“”_百度... ...tool的时候提示microsoft runtime dll安装程序未完成 ...12.0 在安装的时候出现 microsoft runtime dll 然后安装就失败了... 玩游戏提示缺少api-ms win runtime.dll文件啊 跪求!《娘娘腔》全部番外!感激不尽! 水千丞《娘娘腔》全部番外,全部啊全部,790941527@qq.com谢谢咯 如何把中国画颜料的装颜色的东东弄开 photoshop CS4中全选后,怎么不能对选取进行缩放,扩大等操作啊??_百度... 毛阿敏的一首歌女人不是月亮,这首歌的连续剧名是不是叫篱笆女人和狗?谢... 要写论文了,关于油画的,谁能给个题? 我要写一篇艺术小论文 可我完全没思路 怎么办? 为什么韩漫都有遮挡 我左边的颈椎老是咯吱咯吱响,很不舒服,有好几年了,有什么治疗方法。