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