Android AsyncTask使用心得及错误处理-只能在主线程改变UI组件

大家肯定都会经常使用AsyncTask这个类,特别是在网络处理中,先看改正后的代码:这是正常的代码:

class sendKeyTask extends AsyncTask<String, Void, Integer>
	{

		@Override
		protected void onPostExecute(Integer resultCode) {
			// TODO Auto-generated method stub
			super.onPostExecute(resultCode);
			switch (resultCode) {
			case 6000:
				NotifyHelper.popNotifyInfo(InnerQuestionActivity.this, "用户信息异常", "");
				break;
			case 6001:
				NotifyHelper.popNotifyInfo(InnerQuestionActivity.this, "其他异常", "");
				break;
			case 6002:

				break;
			default:
				break;
			}
			// 隐藏输入法
			InputMethodManager imm = (InputMethodManager) getApplicationContext().getSystemService(Context.INPUT_METHOD_SERVICE);
			// 显示或者隐藏输入法
			imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
			innerQuestionEdit.setText("");
			//从新刷新
			new getQuestionDetailTack().execute(1);

		}

		@Override
		protected Integer doInBackground(String... data) {
			// TODO Auto-generated method stub
			int resultCode=4001;
			HttpClient client= new DefaultHttpClient();
			HttpPost post = new HttpPost("http://diandianapp.sinaapp.com/add_key.php");
			StringBuilder builder = new StringBuilder();
			List<NameValuePair> paramsList=new ArrayList<NameValuePair>();
			paramsList.add(new BasicNameValuePair("access_token", data[0]));
			paramsList.add(new BasicNameValuePair("user_name", data[1]));
			paramsList.add(new BasicNameValuePair("key_detail", data[2]));
			paramsList.add(new BasicNameValuePair("question_id", data[3]));
			for(int i=0;i<jpegDataList.size();i++)
			{
				paramsList.add(new BasicNameValuePair
						("img"+String.valueOf(i), jpegDataList.get(i)));
			}

			try {
				post.setEntity( new UrlEncodedFormEntity(paramsList,HTTP.UTF_8));
				} catch (UnsupportedEncodingException e1) {
				e1.printStackTrace();
				}
				try {
				HttpResponse response = client.execute(post);
				HttpEntity entity = response.getEntity();
				BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent()));
				for (String s = reader.readLine(); s != null; s = reader.readLine()) {
				builder.append(s);
				}
				JSONObject jsonObject = new JSONObject(builder.toString());

				String stateCodeStr = jsonObject.getString("state_code");
				resultCode=Integer.parseInt(stateCodeStr);

				}
				catch (ClientProtocolException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (JSONException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
					//处理请求失败
				}
				finally
				{

				}
				return resultCode;

		}

	}

可能有人会说,我让doInBackground返回一个参数,再在onPostExecute里面处理不是多次一举吗?但是,当你真的将两部分合成后,会发现,竟然报错了!报错内容大体为UI内容只能在主线程更改;这是为什么呢!

NotifyHelper.popNotifyInfo(InnerQuestionActivity.this, "其他异常", "");是对对话提示框的一个弹出方法封装,这是对UI界面的操作,问题应该就出在这儿了!

我们翻开google的说明看下:

protected abstract Result
doInBackground (Params... params)

Added in API level 3

Override this method to perform a computation on a background thread. The specified parameters are the parameters passed to
execute(Params...) by the caller of this task. This method can call
publishProgress(Progress...) to publish updates on the UI thread.

Parameters
params The parameters of the task.
Returns
  • A result, defined by the subclass of this task.

protected void onPostExecute
(Result result)

Added in API level 3

Runs on the UI thread after doInBackground(Params...). The specified result is the value returned by
doInBackground(Params...).

This method won‘t be invoked if the task was cancelled.

Parameters
result The result of the operation computed by doInBackground(Params...).
See Also

protected void onPreExecute
()

Added in API level 3

Runs on the UI thread before doInBackground(Params...).

我们可以看出,这几个重载方法只有doInBackground是在后台线程运行的,而后台是不能执行更新线程的操作的!

我们必须要在doInbackground中,返回耗时操作的处理结果,再从onPostExecute中根据doInBackground返回的参数进行UI组件的操作!

doInBackground
时间: 2024-10-28 10:26:01

Android AsyncTask使用心得及错误处理-只能在主线程改变UI组件的相关文章

Android之——任意时刻从子线程切换到主线程的实现(插曲)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45951149 一.引入 在Android开发中常常会遇到网络请求,数据库数据准备等一些耗时的操作:而这些操作是不允许在主线程中进行的.因为这样会堵塞主线程导致程序出现未响应情况. 所以只能另起一个子线程进行这些耗时的操作,完成后再显示到界面.众所周知,界面等控件操作只能在主线程中完成:所以不可避免的需要从子线程切换到主线程. 二.方法 对于这样的情况在Android 中比较常见的

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)、(子线程 与 子线程之间)

keyword:Android 使用handler实现线程间发送消息 (主线程 与 子线程之间).(子线程 与 子线程之间) 相信大家平时都有使用到异步线程往主线程(UI线程)发送消息的情况. 本文主要研究Handler的消息发送. 包含主线程往子线程发送消息,子线程之间互相发送消息. 一.主线程向子线程发送消息. 实现过程比較简单: 主线程发送消息到异步线程.异步线程接收到消息后在再发送一条消息给主线程. 1. 初始化主线程的Handler,用来接收子线程的消息. 2. 启动异步线程.在异步线

Android中,子线程使用主线程中的组件出现问题的解决方法

Android中,主线程中的组件,不能被子线程调用,否则就会出现异常. 这里所使用的方法就是利用Handler类中的Callback(),接受线程中的Message类发来的消息,然后把所要在线程中执行的功能交由Handler类来处理.这样就解决了线程出现的问题. 下面测试实例功能为单击图片,图片透明度改变为50,300毫秒后恢复不透明,代码如下: public class Demo extends Activity{ private ImageView changeImg = null;//Im

Android笔记(三十二) Android中线程之间的通信(四)主线程给子线程发送消息

之前的例子都是我们在子线程(WorkerThread)当中处理并发送消息,然后在主线程(UI线程)中获取消息并修改UI,那么可以不可以在由主线程发送消息,子线程接收呢?我们按照之前的思路写一下代码: package cn.lixyz.handlertest; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; import andr

只能在主线程更改界面

问题: 在主线程之外的线程更改界面,会报错:This application is modifying the autolayout engine from a background thread, which can lead to engine corruption and weird crashes. This will cause an exception in a future release. 解决方法: 把更改界面的语句写在这里面: dispatch_async(dispatch_

Android在线程中发送GET和POST请求 在主线程更新UI

public class GetPostUtil { /** * 向指定URL发送GET方法的请求 * * @param url * 发送请求的URL * @param params * 请求参数,请求参数应该是name1=value1&name2=value2的形式. * @return URL所代表远程资源的响应 */ public static String sendGet(String url, String params) { String result = "";

android Asynctask的优缺点?能否同时并发100+asynctask呢?

一  Asynctask的优缺点? AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 优点: 1.简单,快捷 2.过程可控 3.使用的缺点: 缺点: 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. Android的AsyncTask比Handler更轻量级一些,适用于简单的异步处理. 首先明确Android之所以有Handle

android AsyncTask介绍

本文转自:http://www.cnblogs.com/devinzhang/archive/2012/02/13/2350070.html 写的很好,向你们推荐 android AsyncTask介绍 AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主

android AsyncTask 使用方法

AsyncTask和Handler对比 1 ) AsyncTask实现的原理,和适用的优缺点 AsyncTask,是android提供的轻量级的异步类,可以直接继承AsyncTask,在类中实现异步操作,并提供接口反馈当前异步执行的程度(可以通过接口实现UI进度更新),最后反馈执行的结果给UI主线程. 使用的优点: l  简单,快捷 l  过程可控 使用的缺点: l  在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. 2 )Handler异步实现的原理和适用的优缺点 在Handler