AsyncTask onPostExecute 未执行问题

在android4.0以下设备上onPostExecute不执行,doInBackground也无抛出异常。

在android4.2以上设备上onPostExecute是执行的,没问题。

那么问题就来了,一路查寻,牵扯出好多问题。

以下是我个人遇到的情况,新建个测试AsyncTask项目没有问题,但是在原项目下问题就来了。

AndroidManifest.xml里加入了android:launchMode="singleTask"

得在UI线程里调用execute;在onCreate中调用,onPostExecute是不执行的。


android-support-v4.jar低版本下,在FragmentActivity下调用,onPostExecute是不执行的。


关键在MAINActivity onCreate中添加

try {

Class.forName("android.os.AsyncTask");

} catch (ClassNotFoundException e) {

e.printStackTrace();

}


以下是案例,有关HTTP请求,需要加入gson.jar

package com.example.asynctasktest;

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

public class MainActivity extends Activity {

	private Button button;  
    private ProgressBar progressBar;  
    private TextView textView;  
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        button = (Button)findViewById(R.id.button03);  
        progressBar = (ProgressBar)findViewById(R.id.progressBar02);  
        textView = (TextView)findViewById(R.id.textView01);  
          
        button.setOnClickListener(new OnClickListener() {  
              
            @Override  
            public void onClick(View v) {  
            	startGetArea();
            }  
        });  
        
        ProgressBarAsyncTask asyncTask = new ProgressBarAsyncTask(textView, progressBar);  
        asyncTask.execute("http://www.xxx.com/getAreaList.htm");
        
        
    }

    public void startGetArea()
    {
    	Message msg = mhandler.obtainMessage();
		msg.what = 1;
		mhandler.sendMessage(msg);
    }
    
    /**
	 * handler处理消息机制
	 */
	protected Handler mhandler = new Handler() {

		public void handleMessage(Message message) {
			switch (message.what) {
			case 1:
				new ProgressBarAsyncTask(textView, progressBar).execute("http://www.xxx.com/getAreaList.htm");
				break;
			}
		}
	};

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
}


package com.example.asynctasktest;

import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpEntity;
import org.apache.http.util.EntityUtils;

import android.os.AsyncTask;  
import android.util.Log;
import android.widget.ProgressBar;  
import android.widget.TextView;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.reflect.TypeToken;

/**  
 * 生成该类的对象,并调用execute方法之后  
 * 首先执行的是onProExecute方法  
 * 其次执行doInBackgroup方法  
 *  
 */  
public class ProgressBarAsyncTask extends AsyncTask<String, Integer, List<AllArea>> {  
  
    private TextView textView;  
    private ProgressBar progressBar;  
      
    private static Gson gson = new GsonBuilder().setVersion(1).create();
	List<String> listnames = new ArrayList<String>();
	List<String> listid = new ArrayList<String>();
	
    public ProgressBarAsyncTask(TextView textView, ProgressBar progressBar) {  
        super();  
        this.textView = textView;  
        this.progressBar = progressBar;  
    }  
  
  
    /**  
     * 这里的String参数对应AsyncTask中的第一个参数   
     * 这里的List<AllArea>返回值对应AsyncTask的第三个参数  
     * 该方法并不运行在UI线程当中,主要用于异步操作,所有在该方法中不能对UI当中的空间进行设置和修改  
     * 但是可以调用publishProgress方法触发onProgressUpdate对UI进行操作  
     */
    @Override
	protected List<AllArea> doInBackground(String... params) {
		// TODO Auto-generated method stub
		List<AllArea> areaList = null;
		HttpEntity entity;
		try {
			entity = HttpUtil.send(HttpUtil.METHOD_GET, params[0], null);
			String json=EntityUtils.toString(entity);
			Type type = new TypeToken<List<AllArea>>() {}.getType();
			areaList = gson.fromJson(json, type);
			
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return areaList;
	}
  
  
    /**  
     * 这里的String参数对应AsyncTask中的第三个参数(也就是接收doInBackground的返回值)  
     * 在doInBackground方法执行结束之后在运行,并且运行在UI线程当中 可以对UI空间进行设置  
     */  
    @Override
	protected void onPostExecute(List<AllArea> result) {
		// TODO Auto-generated method stub
		super.onPostExecute(result);
		textView.setText("异步操作执行结束" + result);
		if(result == null)
		{
			Log.e("", "result == null");
		}
		else
		{
			Log.e("", "result != null"+result.size());
			for(int i = 0;i<result.size();i++){
				listnames.add(result.get(i).getIndustryName());
				listid.add(result.get(i).getId()+"");
			}
		}
	}
  

    /**
     * 该方法运行在UI线程当中,并且运行在UI线程当中 可以对UI空间进行设置 
     */
    @Override  
    protected void onPreExecute() {  
        textView.setText("开始执行异步线程");  
    }  
  
  
    /**  
     * 这里的Intege参数对应AsyncTask中的第二个参数  
     * 在doInBackground方法当中,,每次调用publishProgress方法都会触发onProgressUpdate执行  
     * onProgressUpdate是在UI线程中执行,所有可以对UI空间进行操作  
     */  
    @Override  
    protected void onProgressUpdate(Integer... values) {  
        int vlaue = values[0];  
        progressBar.setProgress(vlaue);  
    } 
}  


package com.example.asynctasktest;

import java.util.ArrayList;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;

import android.util.Log;

/**
 *	HTTP请求方式类
 * @author Administrator
 *
 */
public class HttpUtil {

	public static final int METHOD_GET=0;
	public static final int METHOD_POST=1;
	
	
	
	/**
	 * 
	 * @param method GET请求
	 * @param url 请求路径
	 * @param pairs 提交参数
	 * @return
	 * @throws Exception
	 */
	public static HttpEntity send(int method,String url,ArrayList<NameValuePair> pairs)throws Exception{
		HttpClient client=new DefaultHttpClient();
		HttpResponse resp=null;
		switch(method){
		case METHOD_GET:
			Log.i("send", url);
			HttpGet get=new HttpGet(url);
			resp=client.execute(get);
			Log.i("send", resp.toString());
			break;
		case METHOD_POST:
			HttpPost post=new HttpPost(url);
			HttpEntity entity=new UrlEncodedFormEntity(pairs,"utf-8");
			post.setEntity(entity);
			post.setHeader("Content-Type", "x-www-form-urlencoded");
			resp=client.execute(post);
			break;
		}
		
		return resp.getEntity();
	}
}

package com.example.asynctasktest;

import java.io.Serializable;

public class AllArea implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = -8325422695071123262L;
	private int id;
	private int type;
	private int parentId;
	private String areaName;
	private String areaNo;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public int getType() {
		return type;
	}
	public void setType(int type) {
		this.type = type;
	}
	public int getParentId() {
		return parentId;
	}
	public void setParentId(int parentId) {
		this.parentId = parentId;
	}
	public String getIndustryName() {
		return areaName;
	}
	public void setIndustryName(String industryName) {
		this.areaName = industryName;
	}
	public String getIndustryDesc() {
		return areaNo;
	}
	public void setIndustryDesc(String industryDesc) {
		this.areaNo = industryDesc;
	}
	
}

[{"state":1,"type":1,"seq":1,"parentId":1,"areaNo":"3601","areaName”:”东城区”,”id”:11},{“state":1,"type":1,"seq":2,"parentId":1,"areaNo":"3602","areaName”:”西城区”,”id”:22},{“state":1,"type":1,"seq":3,"parentId":1,"areaNo":"3603","areaName”:”海淀区”,”id”:33},{“state":1,"type":1,"seq":4,"parentId":1,"areaNo":"3604","areaName”:”朝阳区”,”id”:44},{“state":1,"type":1,"seq":5,"parentId":1,"areaNo":"3605","areaName”:”昌平区”,”id”:55},{“state":1,"type":1,"seq":6,"parentId":1,"areaNo":"3606","areaName”:”丰台区”,”id”:66}]


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值