- 浏览: 123769 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (110)
- android动画 (9)
- android(xml相关) (2)
- android sqlite3 (0)
- android 组件学习 (5)
- android 小技巧 (8)
- android自定义组件 (2)
- android 手机服务 (5)
- android 网络相关 (9)
- android 用户界面 (6)
- 基本概念 (30)
- java基本知识 (3)
- 面试题 (2)
- android sdcard (3)
- android 文件操作 (4)
- 闲谈android风云变幻 (10)
- JNI (3)
- NDK (5)
- linux (6)
- IOS学习 (1)
- Android源码 (1)
最新评论
-
AndLi:
高手
Android 实现书籍翻页效果----原理篇 -
niuniulife2011:
没听懂,任何事情任何人都可以做吧
程序员感想 -
chenliang1234576:
程序员开网店有木有搞头撒?
程序员感想 -
liyanginchina:
请问一下,
1、 A和B分别与S的【主连接】保持联系。
那么 ...
TCP实现P2P通信、TCP穿越NAT的方法、TCP打洞 -
niuniulife2011:
一起进步,我的东西,有些是看了别人的,但是在看了别人的之后,都 ...
windows系统上使用Android NDK r5
在android中,有很多功能是不能放在onCreate或者onStart方法里面,因为这些功能相对
来说费时比较长,比如说下载一个文件,下载的过程比较长,但是如果写在Activity中,
那么这段时间Activity是完全没有响应的,那么就可以将这种处理大量数据或者耗时比较
长的东西放在一个单独的线程中来完成,即Activity是一个线程,而下载的是在另外一个
线程,那么这样就可以使得下载跟Activity之间互不影响,从而得到了良好的用户体验
这里有两种队列,一种是线程队列,就是用postXX方法或者removeCallbacks方法对线程对象的操作。另一种是消息队列,用sendMessage和handleMessage方法来对消息对象进行处理
handler采用的是一个消息队列的方式,每一个handler都有一个与之关联的消息队列,而且是先进先出的方式执行,即:每次加入一个handler,然后拿出来,对其进行处理,然后再拿出另一个,再进行处理
例子一:这个例子仅仅是对线程对象进行操作的测试
Java代码
package org.hualang.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
public class HandlerTest extends Activity {
private Button mybutton1;
private Button mybutton2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mybutton1 = (Button)findViewById(R.id.mybutton1);
mybutton2 = (Button)findViewById(R.id.mybutton2);
mybutton1.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View arg0) {
/**
* 调用Handler的post方法,将要执行的线程对象添加到
* 线程队列中
*/
handler.post(updateThread);
}
});
mybutton2.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
handler.removeCallbacks(updateThread);
}
});
}
//创建Handler对象
Handler handler = new Handler();
/**
* 将要执行的操作卸载写入线程对象的run()方法当中
*/
Runnable updateThread = new Runnable()
{
public void run()
{
System.out.println("更新线程");
//在run方法内部,执行postXX的方法,每隔3秒会执行一次
handler.postDelayed(updateThread, 3000);
}
};
}
package org.hualang.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
public class HandlerTest extends Activity {
private Button mybutton1;
private Button mybutton2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mybutton1 = (Button)findViewById(R.id.mybutton1);
mybutton2 = (Button)findViewById(R.id.mybutton2);
mybutton1.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View arg0) {
/**
* 调用Handler的post方法,将要执行的线程对象添加到
* 线程队列中
*/
handler.post(updateThread);
}
});
mybutton2.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
handler.removeCallbacks(updateThread);
}
});
}
//创建Handler对象
Handler handler = new Handler();
/**
* 将要执行的操作卸载写入线程对象的run()方法当中
*/
Runnable updateThread = new Runnable()
{
public void run()
{
System.out.println("更新线程");
//在run方法内部,执行postXX的方法,每隔3秒会执行一次
handler.postDelayed(updateThread, 3000);
}
};
}
运行结果如下:
程序解释:首先创建一个Handler对象,然后创建一个继承自Runnable接口的线程
程序首先点击按钮“开始”,于是会马上执行post方法,将执行的线程对象添加到线程队列中,这时会马上执行
Java代码
public void run()
{
System.out.println("更新线程");
//在run方法内部,执行postXX的方法,每隔3秒会执行一次
handler.postDelayed(updateThread, 3000);
}
public void run()
{
System.out.println("更新线程");
//在run方法内部,执行postXX的方法,每隔3秒会执行一次
handler.postDelayed(updateThread, 3000);
}
然后,执行postDelayed方法,由于里面设置的间隔时间,所以每3秒会调价一个handler对象到线程队列中,并且一直执行,直到点击“结束”按钮,调用removeCallbacks方法将其从线程队列中移除
例子2:下面的例子将简单的对线程对象和消息对象进行处理
Java代码
package org.hualang.handlertest2;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
public class HandlerTest2 extends Activity {
private ProgressBar bar = null;
private Button start = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bar = (ProgressBar)findViewById(R.id.progress1);
start = (Button)findViewById(R.id.start);
start.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v) {
bar.setVisibility(View.VISIBLE);
handler.post(handlerThread);
}
});
}
/**
* 使用匿名内部类来复写hanlder当中的hanldrMessage方法
* 这里的msg对象就是从线程部分发送过来的对象
*/
Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
bar.setProgress(msg.arg1);
handler.post(handlerThread);
}
};
//线程类,该类使用的是匿名内部类的方式进行声明
Runnable handlerThread = new Runnable()
{
int i = 0;
public void run()
{
System.out.println("开始线程");
i = i + 10;
/**
* 得到一个消息对象,Message类是由android操作系统提供
* obtainMessage方法用来得到Message对象
*/
Message msg = handler.obtainMessage();
/**
* Message中有个成员变量,即msg独享的arg1参数
* 将其值设置为i。用arg1或arg2这两个成员变量传递
* 消息,优点是系统性能消耗较少
*/
msg.arg1 = i;
try {
//当前线程休眠1秒
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 发送一个消息,用sendMessage是将msg加入到消息
* 队列中。而post是将线程加入到线程队列中
*/
handler.sendMessage(msg);
if( i == 100)
{
/**
* 如果i=100的时候,就将线程对象
* 从handler当中移除
*/
handler.removeCallbacks(handlerThread);
bar.setVisibility(View.GONE);
}
}
};
}
package org.hualang.handlertest2;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
public class HandlerTest2 extends Activity {
private ProgressBar bar = null;
private Button start = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bar = (ProgressBar)findViewById(R.id.progress1);
start = (Button)findViewById(R.id.start);
start.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v) {
bar.setVisibility(View.VISIBLE);
handler.post(handlerThread);
}
});
}
/**
* 使用匿名内部类来复写hanlder当中的hanldrMessage方法
* 这里的msg对象就是从线程部分发送过来的对象
*/
Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
bar.setProgress(msg.arg1);
handler.post(handlerThread);
}
};
//线程类,该类使用的是匿名内部类的方式进行声明
Runnable handlerThread = new Runnable()
{
int i = 0;
public void run()
{
System.out.println("开始线程");
i = i + 10;
/**
* 得到一个消息对象,Message类是由android操作系统提供
* obtainMessage方法用来得到Message对象
*/
Message msg = handler.obtainMessage();
/**
* Message中有个成员变量,即msg独享的arg1参数
* 将其值设置为i。用arg1或arg2这两个成员变量传递
* 消息,优点是系统性能消耗较少
*/
msg.arg1 = i;
try {
//当前线程休眠1秒
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 发送一个消息,用sendMessage是将msg加入到消息
* 队列中。而post是将线程加入到线程队列中
*/
handler.sendMessage(msg);
if( i == 100)
{
/**
* 如果i=100的时候,就将线程对象
* 从handler当中移除
*/
handler.removeCallbacks(handlerThread);
bar.setVisibility(View.GONE);
}
}
};
}
main.xml
Xml代码
<?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"
>
<ProgressBar
android:id="@+id/progress1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone"
style="?android:attr/progressBarStyleHorizontal"
/>
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="点击我"
/>
</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"
>
<ProgressBar
android:id="@+id/progress1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone"
style="?android:attr/progressBarStyleHorizontal"
/>
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="点击我"
/>
</LinearLayout>
运行结果:
程序说明:
1、当点击按钮后,会执行按钮的onClick方法中的
Java代码
bar.setVisibility(View.VISIBLE);
handler.post(handlerThread);
bar.setVisibility(View.VISIBLE);
handler.post(handlerThread); 将进度条显示出来,并且将线程对象加入到线程队列中
2、线程对象对先打印出一个“开始线程”,然后i的值增加10,然后从系统中获取一个Message对象
3、将i赋给Message对象的参数arg1
4、当前线程休眠5秒,然后通过sendMessage方法发送一个Message对象发送到消息队列中
5、然后再执行,通过handleMessage方法设置进度条的值,并且将其加入到进程队列中
Java代码
Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
bar.setProgress(msg.arg1);
handler.post(handlerThread);
}
};
Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
bar.setProgress(msg.arg1);
handler.post(handlerThread);
}
}; 6、循环执行,直到i=100,进度条隐藏,并将线程对象从线程队列中取出
来说费时比较长,比如说下载一个文件,下载的过程比较长,但是如果写在Activity中,
那么这段时间Activity是完全没有响应的,那么就可以将这种处理大量数据或者耗时比较
长的东西放在一个单独的线程中来完成,即Activity是一个线程,而下载的是在另外一个
线程,那么这样就可以使得下载跟Activity之间互不影响,从而得到了良好的用户体验
这里有两种队列,一种是线程队列,就是用postXX方法或者removeCallbacks方法对线程对象的操作。另一种是消息队列,用sendMessage和handleMessage方法来对消息对象进行处理
handler采用的是一个消息队列的方式,每一个handler都有一个与之关联的消息队列,而且是先进先出的方式执行,即:每次加入一个handler,然后拿出来,对其进行处理,然后再拿出另一个,再进行处理
例子一:这个例子仅仅是对线程对象进行操作的测试
Java代码
package org.hualang.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
public class HandlerTest extends Activity {
private Button mybutton1;
private Button mybutton2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mybutton1 = (Button)findViewById(R.id.mybutton1);
mybutton2 = (Button)findViewById(R.id.mybutton2);
mybutton1.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View arg0) {
/**
* 调用Handler的post方法,将要执行的线程对象添加到
* 线程队列中
*/
handler.post(updateThread);
}
});
mybutton2.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
handler.removeCallbacks(updateThread);
}
});
}
//创建Handler对象
Handler handler = new Handler();
/**
* 将要执行的操作卸载写入线程对象的run()方法当中
*/
Runnable updateThread = new Runnable()
{
public void run()
{
System.out.println("更新线程");
//在run方法内部,执行postXX的方法,每隔3秒会执行一次
handler.postDelayed(updateThread, 3000);
}
};
}
package org.hualang.handler;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
public class HandlerTest extends Activity {
private Button mybutton1;
private Button mybutton2;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mybutton1 = (Button)findViewById(R.id.mybutton1);
mybutton2 = (Button)findViewById(R.id.mybutton2);
mybutton1.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View arg0) {
/**
* 调用Handler的post方法,将要执行的线程对象添加到
* 线程队列中
*/
handler.post(updateThread);
}
});
mybutton2.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
handler.removeCallbacks(updateThread);
}
});
}
//创建Handler对象
Handler handler = new Handler();
/**
* 将要执行的操作卸载写入线程对象的run()方法当中
*/
Runnable updateThread = new Runnable()
{
public void run()
{
System.out.println("更新线程");
//在run方法内部,执行postXX的方法,每隔3秒会执行一次
handler.postDelayed(updateThread, 3000);
}
};
}
运行结果如下:
程序解释:首先创建一个Handler对象,然后创建一个继承自Runnable接口的线程
程序首先点击按钮“开始”,于是会马上执行post方法,将执行的线程对象添加到线程队列中,这时会马上执行
Java代码
public void run()
{
System.out.println("更新线程");
//在run方法内部,执行postXX的方法,每隔3秒会执行一次
handler.postDelayed(updateThread, 3000);
}
public void run()
{
System.out.println("更新线程");
//在run方法内部,执行postXX的方法,每隔3秒会执行一次
handler.postDelayed(updateThread, 3000);
}
然后,执行postDelayed方法,由于里面设置的间隔时间,所以每3秒会调价一个handler对象到线程队列中,并且一直执行,直到点击“结束”按钮,调用removeCallbacks方法将其从线程队列中移除
例子2:下面的例子将简单的对线程对象和消息对象进行处理
Java代码
package org.hualang.handlertest2;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
public class HandlerTest2 extends Activity {
private ProgressBar bar = null;
private Button start = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bar = (ProgressBar)findViewById(R.id.progress1);
start = (Button)findViewById(R.id.start);
start.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v) {
bar.setVisibility(View.VISIBLE);
handler.post(handlerThread);
}
});
}
/**
* 使用匿名内部类来复写hanlder当中的hanldrMessage方法
* 这里的msg对象就是从线程部分发送过来的对象
*/
Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
bar.setProgress(msg.arg1);
handler.post(handlerThread);
}
};
//线程类,该类使用的是匿名内部类的方式进行声明
Runnable handlerThread = new Runnable()
{
int i = 0;
public void run()
{
System.out.println("开始线程");
i = i + 10;
/**
* 得到一个消息对象,Message类是由android操作系统提供
* obtainMessage方法用来得到Message对象
*/
Message msg = handler.obtainMessage();
/**
* Message中有个成员变量,即msg独享的arg1参数
* 将其值设置为i。用arg1或arg2这两个成员变量传递
* 消息,优点是系统性能消耗较少
*/
msg.arg1 = i;
try {
//当前线程休眠1秒
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 发送一个消息,用sendMessage是将msg加入到消息
* 队列中。而post是将线程加入到线程队列中
*/
handler.sendMessage(msg);
if( i == 100)
{
/**
* 如果i=100的时候,就将线程对象
* 从handler当中移除
*/
handler.removeCallbacks(handlerThread);
bar.setVisibility(View.GONE);
}
}
};
}
package org.hualang.handlertest2;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
public class HandlerTest2 extends Activity {
private ProgressBar bar = null;
private Button start = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bar = (ProgressBar)findViewById(R.id.progress1);
start = (Button)findViewById(R.id.start);
start.setOnClickListener(new Button.OnClickListener()
{
@Override
public void onClick(View v) {
bar.setVisibility(View.VISIBLE);
handler.post(handlerThread);
}
});
}
/**
* 使用匿名内部类来复写hanlder当中的hanldrMessage方法
* 这里的msg对象就是从线程部分发送过来的对象
*/
Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
bar.setProgress(msg.arg1);
handler.post(handlerThread);
}
};
//线程类,该类使用的是匿名内部类的方式进行声明
Runnable handlerThread = new Runnable()
{
int i = 0;
public void run()
{
System.out.println("开始线程");
i = i + 10;
/**
* 得到一个消息对象,Message类是由android操作系统提供
* obtainMessage方法用来得到Message对象
*/
Message msg = handler.obtainMessage();
/**
* Message中有个成员变量,即msg独享的arg1参数
* 将其值设置为i。用arg1或arg2这两个成员变量传递
* 消息,优点是系统性能消耗较少
*/
msg.arg1 = i;
try {
//当前线程休眠1秒
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 发送一个消息,用sendMessage是将msg加入到消息
* 队列中。而post是将线程加入到线程队列中
*/
handler.sendMessage(msg);
if( i == 100)
{
/**
* 如果i=100的时候,就将线程对象
* 从handler当中移除
*/
handler.removeCallbacks(handlerThread);
bar.setVisibility(View.GONE);
}
}
};
}
main.xml
Xml代码
<?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"
>
<ProgressBar
android:id="@+id/progress1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone"
style="?android:attr/progressBarStyleHorizontal"
/>
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="点击我"
/>
</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"
>
<ProgressBar
android:id="@+id/progress1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:visibility="gone"
style="?android:attr/progressBarStyleHorizontal"
/>
<Button
android:id="@+id/start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="点击我"
/>
</LinearLayout>
运行结果:
程序说明:
1、当点击按钮后,会执行按钮的onClick方法中的
Java代码
bar.setVisibility(View.VISIBLE);
handler.post(handlerThread);
bar.setVisibility(View.VISIBLE);
handler.post(handlerThread); 将进度条显示出来,并且将线程对象加入到线程队列中
2、线程对象对先打印出一个“开始线程”,然后i的值增加10,然后从系统中获取一个Message对象
3、将i赋给Message对象的参数arg1
4、当前线程休眠5秒,然后通过sendMessage方法发送一个Message对象发送到消息队列中
5、然后再执行,通过handleMessage方法设置进度条的值,并且将其加入到进程队列中
Java代码
Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
bar.setProgress(msg.arg1);
handler.post(handlerThread);
}
};
Handler handler = new Handler()
{
public void handleMessage(Message msg)
{
bar.setProgress(msg.arg1);
handler.post(handlerThread);
}
}; 6、循环执行,直到i=100,进度条隐藏,并将线程对象从线程队列中取出
发表评论
-
android 学习之android sdk更新问题
2016-08-31 11:48 552http://cristalspring.blog.163.c ... -
make prebuilt
2012-04-27 12:50 2034步骤如下: 1。进入alps-trunk-mg702\vend ... -
优秀组件使用
2011-08-17 16:34 791http://www.cnblogs.com/webabcd/ ... -
在 Android 中各种布局的应用,以及菜单效果的实现
2011-08-17 15:39 1305在 Android 中各种布局的应用,以及菜单效果的实现 ... -
listView优化
2011-07-27 17:46 927于是,改用其它一种写法: public View getVie ... -
在 Ubuntu 10.04 下面安装 Android USB 驱动
2011-07-13 09:52 23351、在 Ubuntu 9.04 下面安装 Android US ... -
Android SDK problem solved in ubuntu 10.04 AMD64
2011-07-13 08:57 1114Failed to get the adb version: ... -
视频码率
2011-07-08 17:52 972码率 码率就是数据 ... -
Android编译问题:Only 64-bit build environments are supported beyond froyo/2.2
2011-07-06 09:58 905下载完代码后,进行make, $cd ~/mydroid $m ... -
windows系统上使用Android NDK r5
2011-07-05 13:54 1303一、cygwin安装及有关工 ... -
APK签名
2011-07-01 17:58 956刚学android,在windows xp ... -
线程--BlockingQueue
2011-07-01 17:57 815特殊的队列:BlockingQueue,如果BlockingQ ... -
设置组件状态--如何动态关闭manifest中的Receiver
2011-07-01 17:56 859为什么要关闭组件? 在用到组件时,有时候我们可能暂时性的不使 ... -
玩转Android---组件篇---Handler的使用(2)
2011-07-01 17:15 969对于Handler来说,它和与它调用它的Activity是出于 ... -
Android sdk 安装后 找不到adb.exe问题解决方法
2011-07-01 14:49 2800最近刚出了android2.3,想尝一下鲜。用Sdk Mana ... -
vs2008:无法打开文件kernel32.lib(LNK1104)
2011-07-01 11:14 2618【背景描述】 系统环境变化:Vista HomeBasic - ... -
vc2008 cl命令环境变量设置
2011-07-01 10:58 1358由于执行C:\Program Files\Microsoft ... -
JNI示例
2011-06-30 17:54 785一、JNI简介 JNI:Java Native Inter ... -
应用获取手机本地图片资源
2011-06-30 14:35 949private Button mGetImg; ... -
手机的分辨率和像素的学习(纠结过一段时间,不过总算明白鸟)
2011-06-30 14:02 775手机的分辨率是对一个手机屏幕能显示的像素点的多少的意思,比如: ...
相关推荐
此外,Handler还可以与其他组件(如Service、BroadcastReceiver等)配合使用,实现更复杂的异步通信场景。 在实际开发中,常常结合AsyncTask、IntentService等其他异步处理方式一起使用,以应对各种复杂的线程同步...
本篇文章将深度剖析名为“CatchThePigeonAndroid”的项目,揭示其背后的Android编程原理和技术细节。 一、项目概述 “CatchThePigeonAndroid”项目,顾名思义,很可能是一款基于Android平台的游戏应用,旨在捕捉...
Android应用通常由Activity、Service、BroadcastReceiver、ContentProvider和Intent等组件构成。在这个项目中,Activity将是游戏的主要界面,负责处理用户交互。开发者需要利用Android的布局管理器如LinearLayout、...
开发Android游戏通常使用Java语言,而Android Studio是官方推荐的集成开发环境(IDE)。对于俄罗斯方块这样的2D游戏,开发者通常会利用Android的SurfaceView或Canvas进行图形绘制,以及 Handler 和 Runnable 结合...
1. **Android开发基础** 在理解这份源代码之前,你需要具备一定的Android开发基础知识,包括Java或Kotlin编程语言,以及对Android Studio的使用。了解Android四大组件(Activity、Service、BroadcastReceiver、...
这个项目标题“时间 android 自定义时钟”暗示我们将会探讨如何在Android应用中创建一个定制化的时钟组件。下面将详细介绍这个主题。 首先,让我们了解Android中的时间显示。Android系统提供了许多内置的API来处理...
避免ANR的方法包括使用异步任务、服务或Handler来处理长时间运行的任务。 2. **Force Close**:当程序出现未捕获的异常并终止时,会触发Force Close。通过充分测试和异常处理,可以预防这种情况。虽然不能直接捕获...
在Android平台上,Canvas是用于2D图形绘制的核心组件,它提供了丰富的绘图API,使得开发者可以自由地在屏幕上画出各种形状、线条、图像等。本项目“Android Canvas 简单打地鼠游戏”就是一个利用Canvas进行游戏开发...
3. **2D图形绘制**:Android提供了Canvas和SurfaceView等组件用于绘制2D图形。游戏中的角色、障碍物和背景等元素都需要通过这些API来绘制。 4. **物理引擎**:为了模拟真实的跳跃效果,涂鸦跳跃可能会使用简单的...
通过这个项目源码的学习,开发者不仅能掌握Android基本组件的使用,还能深入理解游戏开发的生命周期、动画制作、音频处理以及用户体验设计等方面的知识。对于想要提高Android编程技能,尤其是游戏开发能力的开发者来...
1. **环境搭建**:首先,你需要安装Java Development Kit (JDK) 和 Android Studio,它们是Android开发的基础。Android Studio提供了集成的开发环境,包括代码编辑器、调试工具、构建系统等。 2. **Android SDK**:...
在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建具有独特功能和交互的视图组件。这个简易五子棋小游戏就是这样一个实例,它展示了如何将自定义View应用于游戏开发中。下面我们将深入...
一个Android游戏通常包含Activity(应用程序组件)、Layout(界面布局)、Drawable(图像资源)以及Java代码等部分。在这个项目中,主Activity将承载游戏的主要逻辑,而Layout文件则定义了用户界面的布局。图片资源...
5. **炸弹定时爆炸**:这需要使用到Android的计时器(如CountDownTimer或Handler/Runnable组合)来设置定时触发事件,比如炸弹爆炸。同时,还需要考虑爆炸的动画效果,这可能需要用到Animation类或者自定义动画库。 ...
【安卓版俄罗斯方块】是一款经典的休闲益智游戏,它基于传统的俄罗斯方块玩法,针对Android操作系统进行了适配和优化。这款安卓版的俄罗斯方块不仅保留了原版游戏的核心乐趣,还可能加入了新的功能和视觉效果,为...
总结,制作Android版的“俄罗斯方块”涉及到了Android基础组件的使用、自定义View的绘制、游戏逻辑的实现以及性能优化等多个方面,对于Android开发者来说,这是一个很好的学习和实践项目,有助于加深对Android开发的...
"安卓口袋微博"是一款针对Android平台开发的应用程序,它提供了便捷的微博浏览、发布和互动功能,让用户在手机上也能轻松玩转社交网络。这款应用的开发涉及到Android平台的Java编程语言,以及Web服务的交互,是...
可以使用`AsyncTask`或者`Handler`来实现异步操作,这样即使在蓝牙通信过程中,用户仍能正常与界面交互。 **6. 对战匹配** 为了让两个设备能够配对并开始游戏,需要实现一个匹配过程。这可能涉及到扫描、连接和断开...
在开发“俄罗斯方块”时,我们需要理解Java的基本语法、面向对象编程概念,以及如何使用Java的图形用户界面(GUI)组件。 三、Android Studio与Java结合开发 1. 创建项目:首先,打开Android Studio,选择“Start a...