android版本上的异步任务问题<;4.
我开发了一个应用程序来支持android os 4及以上版本。我已经使用Asynctask在应用程序启动期间进行web服务调用 后来我把我的版本改成了9。支持安卓2.3及以上版本。但同样的代码会抛出下面的错误 从SplashActivity线程调用AsyncTaskandroid版本上的异步任务问题<;4.,android,android-asynctask,handler,android-4.0-ice-cream-sandwich,android-2.3-gingerbread,Android,Android Asynctask,Handler,Android 4.0 Ice Cream Sandwich,Android 2.3 Gingerbread,我开发了一个应用程序来支持android os 4及以上版本。我已经使用Asynctask在应用程序启动期间进行web服务调用 后来我把我的版本改成了9。支持安卓2.3及以上版本。但同样的代码会抛出下面的错误 从SplashActivity线程调用AsyncTask mSplashTread=new Thread(){@Override public void run()){ 试一试{ int=0; while(mActive&(wait
mSplashTread=new Thread(){@Override public void run()){
试一试{
int=0;
while(mActive&(wait
日志:
原因:java.lang.RuntimeException:无法在内部创建处理程序
尚未在处调用Looper.prepare()的线程
android.os.Handler.(Handler.java:121)位于
AsyncTask$InternalHandler.(AsyncTask.java:421)位于
AsyncTask$InternalHandler。(AsyncTask.java:421)
我在网上查过了。有人说Asynctask在内部使用处理程序。当它尝试从doInBackgrond()访问UI时。
但同样的代码在OS4及更高版本中运行良好。我不知道安卓2.3版上的Asynctask有什么问题
请帮我做这个 尝试在执行后更新UI,而不是在后台更新。
仅在doInBackground中获取数据,然后在postexecute中使用该数据来更新UI。这意味着您必须在主线程上调用
AsyncTask.execute(…)
方法
虽然前一句话在技术上不正确,但99%的时间是预期行为。毕竟,您使用异步任务将计算从主线程卸载到后台线程。如果您已经在后台线程上,您不需要异步任务,是吗?因为进行服务调用的正确格式如下所示。尝试使用以下格式进行web服务调用
private class AsyncCallWS extends AsyncTask<Void, Void, Void>
{
@Override
protected void onPreExecute()
{
super.onPreExecute();
//show progress dialog
}
@Override
protected Void doInBackground(Void... params)
{
try
{
postData();
}
catch (Exception e)
{
// TODO: handle exception
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(Void result)
{
//dismiss progress dialog
}
}
public void postData()
{
Thread t = new Thread()
{
public void run()
{
Looper.prepare();
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost("http://yourURL");
try
{
// Your webservice code......
}
catch (ClientProtocolException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
catch (JSONException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
Looper.loop(); //Loop in the message queue
}
};
t.start();
}
}
私有类AsyncCallWS扩展了AsyncTask
{
@凌驾
受保护的void onPreExecute()
{
super.onPreExecute();
//显示进度对话框
}
@凌驾
受保护的Void doInBackground(Void…参数)
{
尝试
{
postData();
}
捕获(例外e)
{
//TODO:处理异常
e、 printStackTrace();
}
返回null;
}
@凌驾
受保护的void onPostExecute(void结果)
{
//关闭进度对话框
}
}
public void postData()
{
线程t=新线程()
{
公开募捐
{
Looper.prepare();
HttpClient HttpClient=新的DefaultHttpClient();
HttpPost HttpPost=新的HttpPost(“http://yourURL");
尝试
{
//您的Web服务代码。。。。。。
}
捕获(客户端协议例外e)
{
e、 printStackTrace();
}
捕获(IOE异常)
{
e、 printStackTrace();
}
捕获(JSONException e)
{
//TODO自动生成的捕捉块
e、 printStackTrace();
}
Looper.loop();//消息队列中的循环
}
};
t、 start();
}
}
这将解决您的错误…实际上,问题是我正在从线程调用Asynctask 通过使用runOnUiThread,我从一个线程调用Asynctask,它解决了我的问题
mSplashTread = new Thread() {
@Override
public void run() {
try {
int waited = 0;
while (mActive && (waited < mSplashTime)) {
sleep(100);
if (mActive) {
waited += 100;
}
}
} catch (InterruptedException e) {
AppUtil.getInstance().logErrorMessage(TAG, e.getMessage());
} finally {
if (mIsBackPressed) {
finish();
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
GetMobilePremissionWebservice getMobilePermissionWebservice = new GetMobilePremissionWebservice(
mContext, SplashActivity.this);
getMobilePermissionWebservice
.getMobilePermissionInfo();
}
});
}
}
}
};
mSplashTread=新线程(){
@凌驾
公开募捐{
试一试{
int=0;
while(mActive&(wait
但是我仍然不知道为什么同样的代码在android版本4.2三星s3中工作 您可以发布AsyncTask实现的代码吗?您可以共享代码吗?您在哪个线程中创建第一个AsyncTask实例?似乎内部静态处理程序不是在UI线程中创建的,因此它会引发该异常。我想问题可能是我是从splashactivity线程打来的。但在三星的安卓4.2设备上,同样的功能将如何发挥作用呢?这是错误的。。我们的公司是在后台运作的吗
mSplashTread = new Thread() {
@Override
public void run() {
try {
int waited = 0;
while (mActive && (waited < mSplashTime)) {
sleep(100);
if (mActive) {
waited += 100;
}
}
} catch (InterruptedException e) {
AppUtil.getInstance().logErrorMessage(TAG, e.getMessage());
} finally {
if (mIsBackPressed) {
finish();
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
GetMobilePremissionWebservice getMobilePermissionWebservice = new GetMobilePremissionWebservice(
mContext, SplashActivity.this);
getMobilePermissionWebservice
.getMobilePermissionInfo();
}
});
}
}
}
};