不能内螺纹创建处理程序,也没有所谓的活套。prepare()与AsyncTask的 [英] Can't create handler inside thread that has not called Looper.prepare() with AsyncTask

查看:176
本文介绍了不能内螺纹创建处理程序,也没有所谓的活套。prepare()与AsyncTask的的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用Android上的AsyncTask的类,但我有一个问题。

下面是我的code:

 公共无效CheckIfUserIsLogedIn()
{
    INT用户presence = localDatabase.CheckUser presence();
    如果(用户presence == 0)
    {
        的setContentView(R.layout.main);
        新checkCountryAsync()执行();
    }
    其他
    {
        的setContentView(R.layout.userlogedon);
    }
}类checkCountryAsync扩展的AsyncTask<字符串,字符串,字符串> {    @覆盖
    在preExecute保护无效(){
        super.on preExecute();
    }
    @覆盖
    保护字符串doInBackground(字符串... aurl){
        INT国家presence = localDatabase.CheckCountry presence();
        如果(国家presence == 0)
        {
            CountryTable国家=新CountryTable();
            country.EnterCountry();
        }
        返回null;
    }
}

我不知道我做错了什么。该方法CheckCountry presence()从LocalDatabase类只是做一个查询并返回结果。

感谢您。

编辑:这里是logcat的:

 八月2日至20日:41:25.804:W / dalvikvm(26458):主题ID = 10:螺纹未捕获的异常(组= 0x4001d5a0)退出
8月2日至20日:41:25.834:E / AndroidRuntime(26458):致命异常:AsyncTask的#1
8月2日至20日:41:25.834:E / AndroidRuntime(26458):了java.lang.RuntimeException:执行doInBackground发生错误()
8月2日至20日:41:25.834:E / AndroidRuntime(26458):在android.os.AsyncTask $ 3.done(AsyncTask.java:200)
8月2日至20日:41:25.834:E / AndroidRuntime(26458):在java.util.concurrent.FutureTask中$ Sync.innerSetException(FutureTask.java:274)
8月2日至20日:41:25.834:E / AndroidRuntime(26458):在java.util.concurrent.FutureTask.setException(FutureTask.java:125)
8月2日至20日:41:25.834:E / AndroidRuntime(26458):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:308)
8月2日至20日:41:25.834:E / AndroidRuntime(26458):在java.util.concurrent.FutureTask.run(FutureTask.java:138)
8月2日至20日:41:25.834:E / AndroidRuntime(26458):在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
8月2日至20日:41:25.834:E / AndroidRuntime(26458):在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:581)
8月2日至20日:41:25.834:E / AndroidRuntime(26458):在java.lang.Thread.run(Thread.java:1027)
8月2日至20日:41:25.834:E / AndroidRuntime(26458):了java.lang.RuntimeException:所致。不能内螺纹已不叫尺蠖prepare创造处理器()
。八月2日至20日:41:25.834:E / AndroidRuntime(26458):在android.os.Handler<&初始化GT;(Handler.java:121)
。八月2日至20日:41:25.834:E / AndroidRuntime(26458):在android.app.Activity<&初始化GT;(Activity.java:717)
。八月2日至20日:41:25.834:E / AndroidRuntime(26458):在milos.mdpi.CountryTable<&初始化GT;(CountryTable.java:5)
8月2日至20日:41:25.834:E / AndroidRuntime(26458):在milos.mdpi.MDPIActivity $ checkCountryAsync.doInBackground(MDPIActivity.java:367)
8月2日至20日:41:25.834:E / AndroidRuntime(26458):在milos.mdpi.MDPIActivity $ checkCountryAsync.doInBackground(MDPIActivity.java:1)
8月2日至20日:41:25.834:E / AndroidRuntime(26458):在android.os.AsyncTask $ 2.call(AsyncTask.java:185)
8月2日至20日:41:25.834:E / AndroidRuntime(26458):在java.util.concurrent.FutureTask中$ Sync.innerRun(FutureTask.java:306)
8月2日至20日:41:25.834:E / AndroidRuntime(26458):... 4个


解决方案

看来你是做一些东西更新从您的UI一个非UI 线程。所以,你应该把你的东西更新里面 runOnUiThread()的界面,因此在执行你的用户界面的东西hread本身。

更新:

只是尽量把你的东西获取 CheckCountry presence(); 上preExecute()。所以,你的编辑类应该是这样,

 类checkCountryAsync扩展的AsyncTask<字符串,字符串,字符串> {    INT国家presence = 0;
    @覆盖
    在preExecute保护无效(){
       国家presence = localDatabase.CheckCountry presence();
    }
    @覆盖
    保护字符串doInBackground(字符串... aurl){        Activity_name.this.runOnUiThread(新的Runnable(){        @覆盖
        公共无效的run(){
            如果(国家presence == 0)
            {
              CountryTable国家=新CountryTable();
              country.EnterCountry();
            }
        }
    });
        返回null;
    }
}

I am trying to use the AsyncTask class on android but I have a problem.

Here is my code:

 public void CheckIfUserIsLogedIn ()
{
    int userPresence = localDatabase.CheckUserPresence();
    if (userPresence == 0) 
    {
        setContentView(R.layout.main);
        new checkCountryAsync().execute();
    }
    else
    {
        setContentView(R.layout.userlogedon);
    }
}  

class checkCountryAsync extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute(); 
    }
    @Override
    protected String doInBackground(String... aurl) {
        int countryPresence = localDatabase.CheckCountryPresence();
        if (countryPresence == 0) 
        {
            CountryTable country = new CountryTable() ;
            country.EnterCountry();
        }
        return null;
    }
}

I don't know where I am doing something wrong. The method CheckCountryPresence() from the LocalDatabase class is only making a query and returns a result.

Thank you.

Edit: Here is the logCat:

02-20 08:41:25.804: W/dalvikvm(26458): threadid=10: thread exiting with uncaught exception (group=0x4001d5a0)
02-20 08:41:25.834: E/AndroidRuntime(26458): FATAL EXCEPTION: AsyncTask #1
02-20 08:41:25.834: E/AndroidRuntime(26458): java.lang.RuntimeException: An error occured while executing doInBackground()
02-20 08:41:25.834: E/AndroidRuntime(26458):    at android.os.AsyncTask$3.done(AsyncTask.java:200)
02-20 08:41:25.834: E/AndroidRuntime(26458):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)
02-20 08:41:25.834: E/AndroidRuntime(26458):    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)
02-20 08:41:25.834: E/AndroidRuntime(26458):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)
02-20 08:41:25.834: E/AndroidRuntime(26458):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)
02-20 08:41:25.834: E/AndroidRuntime(26458):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)
02-20 08:41:25.834: E/AndroidRuntime(26458):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)
02-20 08:41:25.834: E/AndroidRuntime(26458):    at java.lang.Thread.run(Thread.java:1027)
02-20 08:41:25.834: E/AndroidRuntime(26458): Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
02-20 08:41:25.834: E/AndroidRuntime(26458):    at android.os.Handler.<init>(Handler.java:121)
02-20 08:41:25.834: E/AndroidRuntime(26458):    at android.app.Activity.<init>(Activity.java:717)
02-20 08:41:25.834: E/AndroidRuntime(26458):    at milos.mdpi.CountryTable.<init>(CountryTable.java:5)
02-20 08:41:25.834: E/AndroidRuntime(26458):    at milos.mdpi.MDPIActivity$checkCountryAsync.doInBackground(MDPIActivity.java:367)
02-20 08:41:25.834: E/AndroidRuntime(26458):    at milos.mdpi.MDPIActivity$checkCountryAsync.doInBackground(MDPIActivity.java:1)
02-20 08:41:25.834: E/AndroidRuntime(26458):    at android.os.AsyncTask$2.call(AsyncTask.java:185)
02-20 08:41:25.834: E/AndroidRuntime(26458):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:306)
02-20 08:41:25.834: E/AndroidRuntime(26458):    ... 4 more

解决方案

Seems you are doing some stuff to Update your UI from a Non-UI thread. So, you should put your stuff to update the UI inside runOnUiThread() so that it executes the stuff on your UI hread itself.

UPDATE:

Just try to put your stuff for getting CheckCountryPresence(); inside onPreExecute(). So your edited class should be like,

class checkCountryAsync extends AsyncTask<String, String, String> {

    int countryPresence = 0;
    @Override
    protected void onPreExecute() {
       countryPresence = localDatabase.CheckCountryPresence();
    }
    @Override
    protected String doInBackground(String... aurl) {

        Activity_name.this.runOnUiThread(new Runnable() {

        @Override
        public void run() {
            if (countryPresence == 0) 
            {
              CountryTable country = new CountryTable() ;
              country.EnterCountry();
            }
        }
    });
        return null;
    }
}

这篇关于不能内螺纹创建处理程序,也没有所谓的活套。prepare()与AsyncTask的的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆