Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android版本上的异步任务问题<;4._Android_Android Asynctask_Handler_Android 4.0 Ice Cream Sandwich_Android 2.3 Gingerbread - Fatal编程技术网

android版本上的异步任务问题<;4.

android版本上的异步任务问题<;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

我开发了一个应用程序来支持android os 4及以上版本。我已经使用Asynctask在应用程序启动期间进行web服务调用

后来我把我的版本改成了9。支持安卓2.3及以上版本。但同样的代码会抛出下面的错误

从SplashActivity线程调用AsyncTask

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();
                            }
                        });
                    }
                }
            }
        };