Volley帮我们省去的那些线程操作代码

简介:         最近两天刚开始用Volley,发现加上框架之后,代码精简了不少,被精简的代码主要体现在了:1,不用去创建新的线程类:一般我们在开启新线程的时候,都使用的是创建新的线程类,重写run方法,将可能会阻塞UI线程的操作放在新线程里面,当新线程执行完成之后,发送一个Message到UI线程,UI线程接收到消息之后,会对消息进行处理,从而完成我们的更新UI的操作。



        最近两天刚开始用Volley,发现加上框架之后,代码精简了不少,被精简的代码主要体现在了:1,不用去创建新的线程类:一般我们在开启新线程的时候,都使用的是创建新的线程类,重写run方法,将可能会阻塞UI线程的操作放在新线程里面,当新线程执行完成之后,发送一个Message到UI线程,UI线程接收到消息之后,会对消息进行处理,从而完成我们的更新UI的操作。2,handler类:通常我们会在我们的Activity里面创建一个handler类,来处理我们的消息的发送与接收。使用了Volley之后,这两个类都省掉了,对于初学者上手也比较容易。

 



      


下面以登录为例,看下代码结构,供初学者跟Volley作对比:



public class Login extends Activity implements OnClickListener {

	/* 界面控件 */
	private EditText accountEditText;// 用戶名
	private EditText pwdEdittext;// 密碼
	private Button btnLogin;// 登录按钮
	private ProgressBar processLogin;// 进度

	/* 标记信息 */
	private static final int MSG_SUCCESS = 0;// 登录成功标示
	private static final int MSG_FAILURE = 1;// 登录失败标示
	private static final int MSG_PwdIsWrong = 2;// 无法查询到用户

	private long mExitTime;

	/* 登录所用handler */
	private Handler mLoginHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case MSG_SUCCESS:
				// 登录成功之后跳转到home
				processLogin.setVisibility(View.GONE);
				Toast.makeText(getApplicationContext(), "登陆成功!",
						Toast.LENGTH_SHORT).show();

				Intent intent = new Intent();
				intent.setClass(Login.this, home.class);
				Login.this.startActivity(intent);
				finish();// 本页面finish掉

				// TODO:返回退出系统

				break;
			case MSG_FAILURE:
				Toast.makeText(getApplicationContext(), "服务器错误,请稍后重试!",
						Toast.LENGTH_SHORT).show();
				processLogin.setVisibility(View.GONE);
				btnLogin.setClickable(true);// 可点击
				break;
			case MSG_PwdIsWrong:
				Toast.makeText(getApplicationContext(), "用户名或密码错误!请重新输入!",
						Toast.LENGTH_SHORT).show();
				processLogin.setVisibility(View.GONE);
				pwdEdittext.setText("");// 清空pwd
				btnLogin.setClickable(true);// 可点击
				break;
			}
		}
	};

	/* 初始化页面控件 */
	private void initView() {
		processLogin = (ProgressBar) findViewById(R.id.processLogin);
		processLogin.setVisibility(View.GONE);
		accountEditText = (EditText) findViewById(R.id.accountEditText);
		accountEditText.setFocusable(true);
		pwdEdittext = (EditText) findViewById(R.id.pwdEdittext);
		btnLogin = (Button) findViewById(R.id.btnLogin);
		btnLogin.setOnClickListener(this);



	/* 创建Activity */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.login);
		initView();
	}

	/* 单击事件 */
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.btnLogin:
			processLogin.setVisibility(View.VISIBLE);
			String strAccount = accountEditText.getText().toString();
			String strPwd = pwdEdittext.getText().toString();
			
			/* 账号密码判空 */
			if (StringUtils.isEmpty(strAccount) && StringUtils.isEmpty(strPwd)) {
				Toast.makeText(getApplicationContext(), "请输入账号和密码!",
						Toast.LENGTH_SHORT).show();
				processLogin.setVisibility(View.GONE);
				break;
			}
			if (StringUtils.isEmpty(strAccount)) {
				Toast.makeText(getApplicationContext(), "账号不能为空!请输入账号!",
						Toast.LENGTH_SHORT).show();
				processLogin.setVisibility(View.GONE);
				break;
			}
			if (StringUtils.isEmpty(strPwd)) {
				Toast.makeText(getApplicationContext(), "密码不能为空!请输入密码!",
						Toast.LENGTH_SHORT).show();
				processLogin.setVisibility(View.GONE);
				break;
			}
			btnLogin.setClickable(false);// 设置登录按钮不可点击

			/* 登录 */
			new Thread() {
				Message msg = new Message();// 返给handler的信息

				@Override
				public void run() {
					// 获取全局对象Application
					AppContext appContext = (AppContext) getApplication();
					try {
						Operator_InfoVo operator_Info = appContext
								.ManagerLogin(accountEditText.getText()
										.toString(), StrManager
										.Encrypt(pwdEdittext.getText()
												.toString()));
						if (operator_Info == null) { // 读取数据出错
							msg.what = 2;
						} else {// 读取到接口数据
							/* 判断账户名密码 */
							// if
							// (operator_Info.getPasswd().toString().equals(pwdEdittext
							// .getText().toString())) {
							msg.what = 0;
							// 保存用户名密码
							SaveUserInfo(operator_Info.getOperator_Info()
									.getOperator_id().toString(), operator_Info
									.getOperator_Info().getName().toString(),
									operator_Info.getOperator_Info().getType()
											.toString());
							// } else {
							// msg.what = 2;
							// }

						}
					} catch (AppException e) {
						e.printStackTrace();
						msg.what = 1;
						msg.obj = e;
					}
					mLoginHandler.sendMessage(msg);
				}
			}.start();
			break;
		default:
			break;
		}
	}

	/* SharedPreference保存登录用户的信息 */
	public boolean SaveUserInfo(String UserID, String UserName,
			String UserType) {
		SharedPreferences sharedPreferences = getSharedPreferences(
				"smarlife-admin-app", Context.MODE_PRIVATE);// 使用默认的操作模式
		Editor editor = sharedPreferences.edit();// 返回一个Editor对象,用于操作sharedPreferences
		// 判断用户名密码是否存在
		if (sharedPreferences.contains("UserID")) {
			editor.remove("UserID");// 存在的情况下移除
		}
		editor.putString("UserType", UserType);
		editor.putString("UserName", UserName);
		editor.putString("UserID", UserID);
		return editor.commit();// 提交操作
	}

	/* 提示是否退出的对话框 */
	protected void dialog() {
		Intent intent = new Intent(Intent.ACTION_MAIN);
		intent.addCategory(Intent.CATEGORY_HOME);
		intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
		startActivity(intent);
		finish();
	}

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
			processLogin.setVisibility(View.GONE);
			dialog();
			return false;
		}
		return false;
	}

}





      在Volley里面:


          


         

          对比以前的AJAX调用,只要重写回调后的成功或者失败的方法就可以了,而且不用时刻去考虑当前是不是在UI线程,能不能更新View的问题。




           






 

目录
相关文章
|
6月前
多线程案例-定时器(附完整代码)
多线程案例-定时器(附完整代码)
297 0
|
4月前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
69 3
|
6月前
|
设计模式 监控 Java
Java多线程基础-11:工厂模式及代码案例之线程池(一)
本文介绍了Java并发框架中的线程池工具,特别是`java.util.concurrent`包中的`Executors`和`ThreadPoolExecutor`类。线程池通过预先创建并管理一组线程,可以提高多线程任务的效率和响应速度,减少线程创建和销毁的开销。
188 2
|
6月前
|
安全 Java
Java多线程基础-10:代码案例之定时器(一)
`Timer` 是 Java 中的一个定时器类,用于在指定延迟后执行指定的任务。它常用于实现定时任务,例如在网络通信中设置超时或定期清理数据。`Timer` 的核心方法是 `schedule()`,它可以安排任务在延迟一段时间后执行。`
131 1
|
6月前
|
消息中间件 Java Kafka
实时计算 Flink版操作报错之Apache Flink中的SplitFetcher线程在读取数据时遇到了未预期的情况,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
3月前
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
|
3月前
|
Java 开发者
解锁Java并发编程的秘密武器!揭秘AQS,让你的代码从此告别‘锁’事烦恼,多线程同步不再是梦!
【8月更文挑战第25天】AbstractQueuedSynchronizer(AQS)是Java并发包中的核心组件,作为多种同步工具类(如ReentrantLock和CountDownLatch等)的基础。AQS通过维护一个表示同步状态的`state`变量和一个FIFO线程等待队列,提供了一种高效灵活的同步机制。它支持独占式和共享式两种资源访问模式。内部使用CLH锁队列管理等待线程,当线程尝试获取已持有的锁时,会被放入队列并阻塞,直至锁被释放。AQS的巧妙设计极大地丰富了Java并发编程的能力。
41 0
|
5月前
|
API
linux---线程互斥锁总结及代码实现
linux---线程互斥锁总结及代码实现
|
5月前
|
Java
【代码诗人】Java线程的生与死:一首关于生命周期的赞歌!
【6月更文挑战第19天】Java线程生命周期,如诗般描绘了从新建到死亡的旅程:创建后待命,`start()`使其就绪,获得CPU则运行,等待资源则阻塞,任务完或中断即死亡。理解生命周期,善用锁、线程池,优雅处理异常,确保程序高效稳定。线程管理,既是艺术,也是技术。
30 3
|
5月前
|
Java
【代码诗人】Java线程的生与死:一首关于生命周期的赞歌!
【6月更文挑战第19天】在Java中,线程经历新建、就绪、运行、阻塞和死亡5个阶段。通过`start()`从新建转为就绪,进而可能运行;阻塞可能因等待资源;完成任务或中断后死亡。管理线程生命周期涉及合理使用锁、线程池、异常处理和优雅关闭,如使用`volatile`和中断标志。了解这些,能提升程序效率和稳定性。
27 2