例子1:android加载自己文件夹的图片,使用R类
main.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"
>
<ImageView
android:id="@+id/iv1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:src="@drawable/longshuai" <!-- longshuai.png为图片的名称,记在资源文件里头,不用文件名后缀-->
/>
</LinearLayout>
注意:强调一下,资源文件的图片命名规则比较严格,由[a-z]和数字和“_”组成,而且不能数字开头,我就常犯傻,命名老是数字或者大写字母开头,这种错误——囧。。
我们要把longshuai.png导入到res中,最简单的方式就是直接找到这个文件夹,复制进去
之后右键更新,我们就可以在res中看到自己的图片了
不用写代码。。直接用自动生成的代码。。
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
效果如下:
2、加载本地图片(其实主要是SdCard中图片)
关于SdCard的使用,可以参见 http://longshuai2007.blog.163.com/blog/static/1420944142011611103950500/
xml文件同上面的是一样的,并不需要修改
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView image1 = (ImageView) findViewById(R.id.iv1); //获得ImageView对象
/*为什么图片一定要转化为 Bitmap格式的!! */
Bitmap bitmap = getLoacalBitmap("/sdcard/tubiao.jpg"); //从本地取图片(在cdcard中获取) //
image1 .setImageBitmap(bitmap); //设置Bitmap
}
/**
* 加载本地图片
* @param url
* @return
*/
public static Bitmap getLoacalBitmap(String url) {
try {
FileInputStream fis = new FileInputStream(url);
return BitmapFactory.decodeStream(fis); ///把流转化为Bitmap图片
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}
}
显示效果如下:
3、获取网络上的图片
mian.xml文件和1中一样,并不需要修改!
代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ImageView image1 = (ImageView) findViewById(R.id.iv1);
//从网上取图片
image1 .setImageBitmap(bitmap); //设置Bitmap
}
/**
* 从服务器取图片
* @param url
* @return
*/
public static Bitmap getHttpBitmap(String url) {
URL myFileUrl = null;
Bitmap bitmap = null;
try {
myFileUrl = new URL(url);
} catch (MalformedURLException e) {
e.printStackTrace();
}
try {
HttpURLConnection conn = (HttpURLConnection) myFileUrl.openConnection();
conn.setConnectTimeout(0);
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
is.close();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
注意:由于需要使用网络,所以 AndroidManfest.xml 文件需要添加使用网络权限!!!
<uses-permission android:name="android.permission.INTERNET" />
这也是我为什么一直错,而且一直找不到原因,它就是不显示图片,什么错误都没有,坑爹啊!!
ackage shenmixiaozhu;
import java.sql.Date;
public class TypeChange {
public TypeChange() {
}
//change the string type to the int type
public static int stringToInt(String intstr)
{
Integer integer;
integer = Integer.valueOf(intstr);
return integer.intValue();
}
//change int type to the string type
public static String intToString(int value)
{
Integer integer = new Integer(value);
return integer.toString();
}
//change the string type to the float type
public static float stringToFloat(String floatstr)
{
Float floatee;
floatee = Float.valueOf(floatstr);
return floatee.floatValue();
}
//change the float type to the string type
public static String floatToString(float value)
{
Float floatee = new Float(value);
return floatee.toString();
}
//change the string type to the sqlDate type
public static java.sql.Date stringToDate(String dateStr)
{
return java.sql.Date.valueOf(dateStr);
}
//change the sqlDate type to the string type
public static String dateToString(java.sql.Date datee)
{
return datee.toString();
}
public static void main(String[] args)
{
java.sql.Date day ;
day = TypeChange.stringToDate("2003-11-3");
String strday = TypeChange.dateToString(day);
System.out.println(strday);
}
}
android 完全退出应用程序
android android 退出应用程序, 单例模式管理Activity
引自:http://www.yoyong.com/archives/199
android 退出应用程序会调用android.os.Process.killProcess(android.os.Process.myPid())
或是System.exit(0),这只是针对第一个Activity(也就是入口的Activity)时生效。如果有A,B,C
三个Activity,而想在B 或C 中Activity 退出,调用上面的方法,往往会销毁当前的Activity 返回上
一个Activity。当然也可以逐个返回上一个Activity,直到跳转到入口的Activity,最后退出应用程
序。但这样比较麻烦,而且逐个返回的体验并不友好。
网上比较流行的方法是定义栈,写一个ExitApplication 类,利用单例模式管理Activity,在每个在
Activity 的onCreate()方法中调用ExitApplication.getInstance().addActivity(this)方法,在退
出时调用ExitApplication.getInstance().exit()方法,就可以完全退出应用程序了。
ExitApplication 类
代码如下:
view plaincopy to clipboardprint?
1 import java.util.LinkedList;
2 import java.util.List;
3
4 import android.app.Activity;
5 import android.app.Application;
6
7 public class ExitApplication extends Application {
9 private List<Activity> activityList=new LinkedList<Activity>();
10 private static ExitApplication instance;
11
12 private ExitApplication()
13 {
14 }
15 //单例模式中获取唯一的ExitApplication 实例
16 public static ExitApplication getInstance()
17 {
18 if(null == instance)
19 {
20 instance = new ExitApplication();
21 }
22 return instance;
23
24 }
25 //添加Activity 到容器中
26 public void addActivity(Activity activity)
27 {
28 activityList.add(activity);
29 }
30 //遍历所有Activity 并finish
31
32 public void exit()
33 {
34
35 for(Activity activity:activityList)
36 {
37 activity.finish();
38 }
39
40 System.exit(0);
41
42 }
43 }
下面的三个类IndexActivity, BActivity,CActivity 是简单的例子, 分别是
IndexActivity–>BActivity–>CActivity 的跳转顺序。在每个Activity 类中onCreate()方法中调
用ExitApplication.getInstance().addActivity(Activity activity)方法。在任何一个Activity 界面退
出应用程序时,只要调用ExitApplication.getInstance().exit()方法,就可以在任何一个Activity
中完全退出应用程序。
IndexActivity 类源代码:
view plaincopy to clipboardprint?
44 import android.app.Activity;
45 import android.content.Intent;
46 import android.os.Bundle;
47 import android.view.View;
48 import android.view.View.OnClickListener;
49 import android.widget.Button;
50
51 public class IndexActivity extends Activity {
52 /** Called when the activity is first created. */
53 @Override
54 public void onCreate(Bundle savedInstanceState) {
55 super.onCreate(savedInstanceState);
56 setContentView(R.layout.main);
57
58 Button next=(Button)findViewById(R.id.next_to_b);
59 next.setOnClickListener(nextClick);
60
61 Button exit=(Button)findViewById(R.id.exit_main);
62 exit.setOnClickListener(exitClick);
63 ExitApplication.getInstance().addActivity(this);
64
65 }
66
67 OnClickListener nextClick=new OnClickListener() {
68
69 @Override
70 public void onClick(View v) {
71 // TODO Auto-generated method stub
72
73 Intent intent=new Intent(IndexActivity.this,BActivity.class);
74 startActivity(intent);
75
76 }
77 };
78
79 OnClickListener exitClick=new OnClickListener() {
80
81 @Override
82 public void onClick(View v) {
83 // TODO Auto-generated method stub
84 ExitApplication.getInstance().exit();
85 }
86 };
87 }
BActivity 类源代码:
view plaincopy to clipboardprint?
88 import android.app.Activity;
89 import android.content.Intent;
90 import android.os.Bundle;
91 import android.view.View;
92 import android.view.View.OnClickListener;
93 import android.widget.Button;
94
95 public class BActivity extends Activity {
96
97 @Override
98 protected void onCreate(Bundle savedInstanceState) {
99 // TODO Auto-generated method stub
100 super.onCreate(savedInstanceState);
101
102 setContentView(R.layout.b);
103 Button next_to_c=(Button)findViewById(R.id.next_to_c);
104 next_to_c.setOnClickListener(next_to_cClick);
105
106 Button exit_b=(Button)findViewById(R.id.exit_b);
107 exit_b.setOnClickListener(exitClick);
108 ExitApplication.getInstance().addActivity(this);
109
110 }
111
112 OnClickListener next_to_cClick=new OnClickListener() {
113
114 @Override
115 public void onClick(View v) {
116 // TODO Auto-generated method stub
117
118 Intent intent=new Intent(BActivity.this,CActivity.class);
119 startActivity(intent);
120
121 }
122 };
123
124 OnClickListener exitClick=new OnClickListener() {
125
126 @Override
127 public void onClick(View v) {
128 // TODO Auto-generated method stub
129 ExitApplication.getInstance().exit();
130 }
131 };
132 }
CActivity 类源代码:
view plaincopy to clipboardprint?
133 import android.app.Activity;
134 import android.os.Bundle;
135 import android.view.View;
136 import android.view.View.OnClickListener;
137 import android.widget.Button;
138
139 public class CActivity extends Activity{
140
141 @Override
142 protected void onCreate(Bundle savedInstanceState) {
143 // TODO Auto-generated method stub
144 super.onCreate(savedInstanceState);
145
146 setContentView(R.layout.c);
147
148 Button exit_c=(Button)findViewById(R.id.exit_c);
149 exit_c.setOnClickListener(exitClick);
150 ExitApplication.getInstance().addActivity(this);
151
152 }
153
154 OnClickListener exitClick=new OnClickListener() {
155
156 @Override
157 public void onClick(View v) {
158 // TODO Auto-generated method stub
159 ExitApplication.getInstance().exit();
160 //如果只是调用以下其中的一个方法,并不会完全退出应用
161 //android.os.Process.killProcess(android.os.Process.myPid());
162 //System.exit(0);
163 }
164 };
165
166 }
1、Listview简述
A view that shows items in a vertically scrolling list. The items come from theListAdapter
associated with this view.
简单来说就是,创建Listview,然后给数值就行了。
而这些数值来源有三种方式:ArrayAdapter、SimpleAdapter、SimpleCursorAdapter
第一种是最简单的一种Adapter,是字符串数值,只能在ListView显示出文本信息。
第二种是一种自定义的数据来源,要自定义布局方式,可以放置图片,按钮,文本之类的。
第三种数据来源于数据库。
本文为第一种方式,ArrayAdapter,其他两项的方法都差不多,主要是adapter不同。
2、使用ListView步骤
首先创建Listview组件,然后调用Listview.ArrayAdapter()方法,设置Adapter。
通过调用setOnItemClickListener
()接口方法,设置“点击”listview某一项的监听事件。
通过调用setOnItemLongClickListener
()接口方法,设置“长按”listview某一项的监听事件。
需要说明的是,当设置匿名内部类new OnItemClickListener()时,eclipse不会自动载入复写函数,要点击左边的错误提示,然后Add unimplemented methods,才能载入复写函数onItemClick()。
- mylistview.setOnItemClickListener(new OnItemClickListener() {
-
- @Override
- public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
- // TODO Auto-generated method stub
-
- }
- });
关于onItemClick方法,下面详细说说。(
以下是官方的说明,参数命名不同而已,类型都是一样的。arg0=parent,arg1=view,arg2=position,arg3=id)
public abstract void onItemClick(AdapterView<?> parent,View view, int position, long id)
Callback method to be invoked when an item in this AdapterView has been clicked.
Implementers can call getItemAtPosition(position) if they need to access the data associated with the selected item.
//当点击listview某一项时,这个回调方法就会被调用。
Parameters
parent | The AdapterView where the click happened. |
view | The view within the AdapterView that was clicked (this will be a view provided by the adapter) |
position | The position of the view in the adapter. |
id | The row id of the item that was clicked. |
主要说说最后三个参数,
view——————是你点击的Listview的某一项的内容,来源于adapter。如用((TextView)arg1).getText(),可以取出点击的这一项的内容,转为string类型。
position————是adapter的某一项,如点击了listview第2项,而第2项对应的是adapter的第2个数值,那此时position的值就为1了。
如对应adapter的第3个数值,那此时position的值就为2了。
id———————id的值为点击了Listview的哪一项对应的数值,点击了listview第2项,那id就等于1。
注:这些数值都是从0开始的。
- /*author:conowen
- * date:2012.2.26
- */
- package com.conowen.listview;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.view.View;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.AdapterView.OnItemLongClickListener;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- import android.widget.TextView;
- import android.widget.Toast;
-
- public class ListviewActivity extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ListView lv = (ListView) findViewById(R.id.lv);
- String[] data = { "windows", "linux", "ios", "android", "wp7",
- "Symbian" };// 定义adapter
- lv.setAdapter(new ArrayAdapter<String>(this,// 把adapter绑定到listview里面
- android.R.layout.simple_expandable_list_item_1, data));
- // 点击事件
- lv.setOnItemClickListener(new OnItemClickListener() {
-
- @Override
- public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
- long arg3) {
- // TODO Auto-generated method stub
- Toast.makeText(ListviewActivity.this, "你点击的是第" + arg3 + "项",
- Toast.LENGTH_SHORT).show();
- // 取出所点击的那一项的id
-
- }
-
- });
- // 长按事件
- lv.setOnItemLongClickListener(new OnItemLongClickListener() {
-
- @Override
- public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
- int arg2, long arg3) {
- // TODO Auto-generated method stub
- Toast.makeText(ListviewActivity.this,
- ((TextView) arg1).getText(), Toast.LENGTH_LONG).show();
- // 取出点击listview某一项的内容
- return false;
- }
-
- });
- }
- }
for(String s:v)
s是遍历后赋值的变量,v是要遍历的list。
可以通过以下语句进行测试:
List<String> v=new ArrayList();
v.add("one");
v.add("two");
for(String s:v){
System.out.println(s);
}
注意s要跟前面的类型匹配。
s表示的其实就是v中得任意一个元素,v可以是数组,也可以是集合,如list或set。这种语句叫做foreach语句。其实就是Iterator迭代器的简化,意思就是循环的从v中拿出一个元素s进行操作
2008-06-01 16:35:46| 分类: mysql |字号 订阅
1.response.setContentType("text/html;charset=gb2312");
在做servlet的时候,在doGet中已经设定了response.setContentType("text/html;charset=gb2312");
pw.println("姓名");
pw.println("性别");
pw.println("邮箱");
pw.println("地址");
pw.println("权限");
这些汉字的可以正确显示,但是从数据库中查询返回的汉字显示为乱码:
姓名 | 性别 | 邮箱 | 地址 | 权限 |
admin | 0 | admin@163.com | ???????? | 1 |
user1 | 0 | user1@163.com | ???????? | 5 |
user2 | 0 | user2@163.com | ???????? | 5 |
user3 | 0 | user3@163.com | ?????à?? | 3 |
user4 | 0 | user4@163.com | ???????¨ | 3 |
user5 | 0 | user5@163.com | ???????¨ | 5 |
user6 | 0 | user6@163.com | ???????¨ | 5 |
最近几天一直都在学JSP,我用的数据库是Mysql。在连接数据库的过程中,刚开始我只是简单的执行了查询命令,发现从数据库取出的中文数据全部显示成了乱码,查了一些资料之后,我先用了下面的一个转换函数,值得高兴的是,读出的中文显示正常:
将从Mysql数据库中得到的中文数据,通过以下转换函数 String trans(String chi)进行处理,即可正常显示中文:
String trans(String chi) {
String result = null;
byte temp[];
try {
temp = chi.getBytes("iso-8859-1");
result = new String(temp);
} catch(UnsupportedEncodingException e) {
System.out.println(e.toString());
}
return result;
}
但很快,我意识到这种方法只是治标不治本,因为在插入中文数据时,又没法在Mysql中正常显示中文。而真正治本的方法是,将Mysql的编码格式由默认的latin1改成gb2312.
改的步骤如下:
1. 设置Mysql的编码格式(注意是在创建数据库之前就要设置)
找到Mysql安装目录下的 myini文件,用记事本打开,找到以下两句:
[mysql]
default-character-set=latin1
--------------------------------------------------------------------------------------------------
[mysqld]
# The TCP/IP Port the MySQL Server will listen on
port=3306
#Path to installation directory. All paths are usually resolved relative to this.
basedir="C:/Program Files/MySQL/MySQL Server 5.0/"
#Path to the database root
datadir="C:/Program Files/MySQL/MySQL Server 5.0/Data/"
# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=latin1
我们需要做的是将这两处的默认编码格式由“latin1”改成“gb2312”。
改好之后,重启Mysql 。
2. 在Mysql中开始创建数据库
用相关命令创建数据库,表等
注意: 在创建表时要加上一句 TYPE=MyISAM, default character set gb2312;
如以下示例:
create table student
-> (sno varchar(20),
-> sname varchar(10),
-> sex char(2),
-> age numeric(2),
-> dept varchar(20),
-> primary key(sno))
-> type=myisam,default character set gb2312;
3. 在Java文件或者JSP文件中连接数据库
在Java代码中:
str = "com.mysql.jdbc.Driver";
url="jdbc:mysql://localhost:3306/example?useUnicode=true&characterEncoding=gb2312";
user = "root";
password = "123456";
Class.forName(str).newInstance();
conn = DriverManager.getConnection(url,user,password);
在JSP中需要注意的有:
<%@page contentType="text/html"%>
<%@page pageEncoding="gb2312" %>
<%@ page import="java.sql.*,java.io.*" %>
gb2312">
OK,经过上述一些设置之后,JAVA连Mysql将不会再出现中文显示乱码!
在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);
- }
- };
- }
运行结果如下:
程序解释:首先创建一个Handler对象,然后创建一个继承自Runnable接口的线程
程序首先点击按钮“开始”,于是会马上执行post方法,将执行的线程对象添加到线程队列中,这时会马上执行
Java代码
- 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);
- }
- }
- };
- }
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>
运行结果:
程序说明:
1、当点击按钮后,会执行按钮的onClick方法中的
Java代码
- 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);
- }
- };
6、循环执行,直到i=100,进度条隐藏,并将线程对象从线程队列中取出
对于Handler来说,它和与它调用它的Activity是出于同一线程的,上一篇并没有调用线程
的start方法,而是直接执行的run方法。而启动一个线程是调用的start方法
上一篇博客里的对Handler的调用时通过Runnable接口来实现的,并且是通过run()方法来启动那个线程的,而且是Activity和 Handler是两个线程独立运行的,互补干扰,但是实际情况确实,Activity所在的线程和Handler的线程是同一个线程,下面进行一下实验
Java代码
- package org.hualang.handlertest3;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.util.Log;
-
- public class HandlerTest3 extends Activity {
- private Handler handler = new Handler();
- private String TAG = "System.out";
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- handler.post(r);
- setContentView(R.layout.main);
- //Thread t = new Thread(r);
- //t.start();
-
- Log.d(TAG,"Activity id:"+Thread.currentThread().getId());
- Log.d(TAG,"Activity name:"+Thread.currentThread().getName());
-
- }
- Runnable r = new Runnable()
- {
- public void run()
- {
- Log.d(TAG,"Handler id:"+Thread.currentThread().getId());
- Log.d(TAG,"Handler name:"+Thread.currentThread().getName());
- try {
- Thread.sleep(5000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- };
- }
运行结果:
证明是同一个线程的两个依据:
①Activity的id或name和Handler的id或name是同样的
②我设置了
handler.post(r);
setContentView(R.layout.main);
也就是,如果执行后马上显示文本信息,那么可以证明它们不在同一个线程,但是实际情况是要先执行了handler后5秒,才显示文本信息,说明它们在同一线程
如果将代码改为
Java代码
- //handler.post(r);
- setContentView(R.layout.main);
- Thread t = new Thread(r);
- t.start();
再次执行,运行结果如下,通过start启动线程,它们不在同一个线程中
----------------------------------------------------------------------------------------------------------------
Looper即循环的从队列当中取得消息的功能,如果在线程中使用Looper
那么,就会循环的从线程队列当中取得消息并处理,如果队列当中没有消息的话
,线程就进入了休眠状态
Looper很少自己创建,在Android中给出了HandlerThread类,并且具有循环取得并处理消息的功能
下面来实现这种Activity和Handler分别在两个线程中执行,实现真正的异步处理
Java代码
- package org.hualang.handlertest;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.HandlerThread;
- import android.os.Looper;
- import android.os.Message;
- import android.util.Log;
-
- public class HandlerTest4 extends Activity {
- /** Called when the activity is first created. */
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- Log.d("System.out","Activity所在线程的id:"+Thread.currentThread().getId());
- /**
- * 生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能
- * 这个类由Android应用程序框架提供
- */
- HandlerThread handlerThread = new HandlerThread("handlerThread");
- handlerThread.start();
- MyHandler handler = new MyHandler(handlerThread.getLooper());
- Message msg = handler.obtainMessage();
- /**
- * 将Message对象发送到目标对象
- * 所谓的目标对象,就是生成该msg对象的handler对象
- */
- msg.sendToTarget();
- }
- class MyHandler extends Handler
- {
- public MyHandler()
- {
- }
- public MyHandler(Looper looper)
- {
- super(looper);
- }
- public void handleMessage(Message msg)
- {
- Log.d("System.out", "handler所在线程的id:"+Thread.currentThread().getId());
- }
- }
- }
运行结果:
可以看到,Activity和Handler是在两个不同的线程中执行的,这样就是实现了真正的异步处理
1、首先创建一个HandlerThread对象,这个HandlerThread类实现了循环的取得消息并处理
2、用start方法启动一个新线程
3、创建MyHandler类,里面传递的参数即Looper方法所获得的可以循环在队列中取得的消息
4、MyHandler类调用的是带参数Looper的构造方法,并且实现了handlerMessage方法
5、获取一个Message对象
6、将这个对象发送到生成该msg对象的handler对象,从而执行了handleMessage方法
-----------------------------------------------------------------------------------------------------
最后,将说一下Message里传送的数据的使用,这里的msg对象可以使用arg1,arg2或者obj
arg1 and arg2 are lower-cost alternatives to using setData()
if you only need to store a few integer values. 也就是相对于setData()方法,如果你仅仅保存一些简单的整形数的话,arg1,arg2对资源的要求较低,而setData()方法一般用于传递 大量数据的时候会用到
如果是msg.obj,那么可以这样用
msg.obj = "Welcome to china";
然后在handleMessage()方法中用
String str = (String)msg.obj;来获得传递的值
如果使用getData()方法的话,需要用到Bundle对象来传递,下面用个例子来说明
Java代码
- Bundle b = new Bundle();
- b.putInt("age", 22);
- b.putString("name", "loulijun");
- msg.setData(b);
- msg.sendToTarget();
上面的代码用来设置要传递的数据
下面的代码用来获取Bundle传递过来的数据并且用Toast来显示
Java代码
- Bundle b = msg.getData();
- int age = b.getInt("age");
- String name = b.getString("name");
- Toast toast = Toast.makeText(getApplicationContext(), "age="+age+"name="+name, Toast.LENGTH_LONG);
- toast.show();
package org.hualang.handlertest;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import android.widget.Toast;
public class HandlerTest4 extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("System.out","Activity所在线程的id:"+Thread.currentThread().getId());
/**
* 生成一个HandlerThread对象,实现了使用Looper来处理消息队列的功能
* 这个类由Android应用程序框架提供
*/
HandlerThread handlerThread = new HandlerThread("handlerThread");
/**
* 使用HandlerThread的getLooper()方法之前,必须先调用该类的start()方法,否则是个null,会报错
*/
handlerThread.start();
MyHandler handler = new MyHandler(handlerThread.getLooper());
Message msg = handler.obtainMessage();
/**
* 将Message对象发送到目标对象
* 所谓的目标对象,就是生成该msg对象的handler对象
*/
//msg.obj = "Hello world";
Bundle b = new Bundle();
b.putInt("age", 22);
b.putString("name", "loulijun");
msg.setData(b);
msg.sendToTarget();
}
class MyHandler extends Handler
{
public MyHandler()
{
}
public MyHandler(Looper looper)
{
super(looper);
}
public void handleMessage(Message msg)
{
//String str = (String)msg.obj
Bundle b = msg.getData();
int age = b.getInt("age");
String name = b.getString("name");
Toast toast = Toast.makeText(getApplicationContext(), "age="+age+"name="+name, Toast.LENGTH_LONG);
toast.show();
Log.d("System.out", "handler所在线程的id:"+Thread.currentThread().getId());
}
}
}
运行结果:
创建HttpServlet的步骤
0人收藏此文章, 我要收藏 发表于3年前(2009-05-31 15:58) , 已有
955次阅读 ,共
0个评论
创建用户自己的HttpServlet类。通常涉及下列4个步骤
- 扩展HttpServlet抽象类
- 覆盖HttpServlet的部分方法,例如覆盖doGet()和doPost()方法
- 获取HTTP请求信息。例如通过HttpServletRequest对象来检索HTML表单所提交的数据或URL上的查询字符串。无论是 HTML表单数据还是URL上的查询字符串,在HttpServletRequest对象中都以参数名/参数值的形式存放,可以通过以下方法检索参数信 息:
- getParameterNames(): 返回一个Enumeration对象。它包含了所有的参数名信息
- getParameter(String name): 返回参数名name对应的参数值
- getParamaterValues(): 返回一个Enumeration对象,它包含了所有的参数值信息
4.生成HTTP响应结果。通过HttpServletResponse对象可以生成响应结果。HttpServletResponse对象有一个 getWriter()方法,该方法返回一个PrintWriter对象。使用PrintWriter的print()或println()方法可以向客 户端发送字符串数据流。
例子: 提供一个Servlet样例(HelloServlet.java)
package com.myServlet
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class HelloServlet extends HttpServlet // 第一步:扩展HttpServlet抽象类
{
// 第二步: 覆盖doGet()方法
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException ,ServletException{
// 第三步: 获取HTTP请求中的参数信息
String clientName=request.getParameter("clientName");
if(clientName!=null)
clientName=new String(clientName.getBytes("ISO-8859-1"),"GB2312");
else
clientName="你好"
// 第四步
PrintWriter out;
String title="HelloServlet";
String heading1="This is output from HelloServlet by doGet:";
response.setContentType("text/html;charset=GB2312");
out=response.getWriter();
out.print("<HTML><HEAD><TITLE>"+title+"</TITLE>);
out.print("</HEAD><BODY>")
out.print(heading1);
out.println("<h1><P>"+clientName+":你好</h1>"+);
out.print("</BODY></HTML>");
out.close();
}
}
上述HelloServlet类扩展HttpServlet抽象类,覆盖了doGet方法。在重写的doGet方法中,通过 getParameter方法读取HTTP请求中的一个参数ClientName。在上述代码中,为了解决汉化问题,做了必要的转码工作。客户提交的查询 数据采用默认的ISO-8859-1编码,应该把它转换为中文编码GB2312:
// 字符编码转换
clientName=new String(clientName.getBytes(“ISO-8859-1”),"GB2312");
// 设置输出响应数据的字符编码
response.setContentType("text/html;charset=GB2312");
HellowServlet.class 的存放位置为:
<CATALINA_HOME>/webapps/helloapp/WEB-INF/classes/mypack/HelloServlet.class
在Web.xml中位HelloServlet类加上如下<servlet>和<servlet-mapping>元素:
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>mypackCounterServlet</servlet-class>
</servlet>
<servlet-mapping>HelloServlet</servlet-mapping>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
然后通过如下URL访问HelloServlet:
有些网友不知道怎么才能运行自己的JSP文件,我在这里简单介绍一下,给大家提供一点参考:
1. 下载并安装tomcat。下载地址:http://jakarta.apache.org/tomcat
2. 编写自己的JSP网页和Java对象。
3. 配置自己的Web应用。配置方法:
在TOMCAT_HOME/conf/server.xml文件中加入一行:
<Content path="/appName" docBase="webapps/appName" debug="0" reloadable="true"/>
其中,TOMCAT_HOME是tomcat的主目录,appName是你的Web应用的名称。
4. 将你的jsp文件、html文件、image文件拷贝到TOMCAT_HOME/webapps/appName目录下。
5. 编译你的java文件。
6. 将编译好的class文件拷贝到TOMCAT_HOME/webapps/WEB-INF/classes目录下。也可将class文件打包成jar文件放到TOMCAT_HOME/webapps/WEB-INF/lib目录下。
7. ALL IS OK! 你可以在你的浏览器上看到你的成果了:
http://localhost:8080/appName/youjsp.jsp
其中,appName是你配的Web应用名称,youjsp.jsp是你编写的jsp文件名。
1.输入密码:******
2.ues mysql;使用Mysql
3.show databases;显示数据库
4.use register;使用数据库名为register
5.show tables;显示register数据库中的表
6.describe user;对表user进行操作:
insert into user(username,password) values("xiaoyan","123456");插入数据
insert into user(username,password) values("ff","123456");插入数据
delete from user where username="xiaoyan";删除数据
update user set username="xiaoyan" where username="ff";更新数据
select * from user;查询数据
7.quit;推出
1、显示当前数据库服务器中的数据库列表:
mysql> SHOW DATABASES;
注意:mysql库里面有MYSQL的系统信息,我们改密码和新增用户,实际上就是用这个库进行操作。
2、显示数据库中的数据表:
mysql> USE 库名;
mysql> SHOW TABLES;
3、显示数据表的结构:
mysql> DESCRIBE 表名;
4、建立数据库:
mysql> CREATE DATABASE 库名;
5、建立数据表:
mysql> USE 库名;
mysql> CREATE TABLE 表名 (字段名 VARCHAR(20), 字段名 CHAR(1));
6、删除数据库:
mysql> DROP DATABASE 库名;
7、删除数据表:
mysql> DROP TABLE 表名;
8、将表中记录清空:
mysql> DELETE FROM 表名;
9、显示表中的记录:
mysql> SELECT * FROM 表名;
10、往表中插入记录:
mysql> INSERT INTO 表名 VALUES (”hyq”,”M”);
11、更新表中数据:
mysql-> UPDATE 表名 SET 字段名 1=’a',字段名2=’b’ WHERE 字段名3=’c';
12、用文本方式将数据装入数据表中:
mysql> LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE 表名;
13、导入.sql文件命令:
mysql> USE 数据库名;
mysql> SOURCE d:/mysql.sql;
14、命令行修改root密码:
mysql> UPDATE mysql.user SET password=PASSWORD(’新密码’) WHERE User=’root’;
mysql> FLUSH PRIVILEGES;
15、显示use的数据库名:
mysql> SELECT DATABASE();
16、显示当前的user:
mysql> SELECT USER();
一、启动与退出
1、进入MySQL:启动MySQL Command Line Client(MySQL的DOS界面),直接输入安装时的密码即可。此时的提示符是:mysql>
2、退出MySQL:quit 或 exit
二、库操作
1、创建数据库
命令:create database
例如:建立一个名为xhkdb的数据库
mysql> create database xhkdb;
2、显示所有的数据库
命令:show databases (注意:最后有个s)
mysql> show databases;
3、删除数据库
命令:drop database
例如:删除名为 xhkdb的数据库
mysql> drop database xhkdb;
4、连接数据库
命令: use
例如:如果xhkdb数据库存在,尝试存取它:
mysql> use xhkdb;
屏幕提示:Database changed
5、当前选择(连接)的数据库
mysql> select database();
6、当前数据库包含的表信息:
mysql> show tables; (注意:最后有个s)
三、表操作,操作之前应连接某个数据库
1、建表
命令:create table ( [,.. ]);
mysql> CREATE TABLE `testa` (
-> `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
-> `name` varchar(20) DEFAULT NULL ,
-> PRIMARY KEY (`id`)
-> ) ENGINE=MyISAM AUTO_INCREMENT=65 DEFAULT CHARSET=utf8;
2、获取表结构
命令: desc 表名,或者show columns from 表名
mysql> DESCRIBE MyClass
mysql> desc MyClass;
mysql> show columns from MyClass;
3、删除表
命令:drop table
例如:删除表名为 MyClass 的表
mysql> drop table MyClass;
4、插入数据
命令:insert into [( [,.. ])] values ( 值1 )[, ( 值n )]
5、查询表中的数据
1)、查询所有行
mysql> select * from MyClass;
2)、查询前几行数据
mysql> select * from MyClass order by id limit 0,2;
6、删除表中数据
命令:delete from 表名 where 表达式
例如:删除表 MyClass中编号为1 的记录
mysql> delete from MyClass where id=1;
7、修改表中数据:update 表名 set 字段=新值,… where 条件
mysql> update MyClass set name=”Mary” where id=1;
8、在表中增加字段:
命令:alter table 表名 add字段 类型其他;
例如:在表MyClass中添加了一个字段passtest,类型为int(4),默认值为0
mysql> alter table MyClass add passtest int(4) default ”0”
9、更改表名:
命令:rename table 原表名 to 新表名;
例如:在表MyClass名字更改为YouClass
mysql> rename table MyClass to YouClass;