Android 如何从线程打开AsyncTask
在我的应用程序中,我创建了一个Android 如何从线程打开AsyncTask,android,multithreading,android-activity,android-asynctask,Android,Multithreading,Android Activity,Android Asynctask,在我的应用程序中,我创建了一个SplashScreen,它将显示5秒钟,然后根据首选项文件中存储的值执行if-else情况。如果首选项文件包含值,则将运行AsyncTask代码,否则将加载登录表单。当我尝试运行我的应用程序时。线程将在intent的帮助下进入登录表单,但当涉及到AsyncTask时,我的应用程序将显示一条强制关闭错误消息 这是我的SplashScreen代码: public class SplashScreen extends Activity { @Override prot
SplashScreen
,它将显示5秒钟,然后根据首选项文件中存储的值执行if-else情况。如果首选项文件包含值,则将运行AsyncTask
代码,否则将加载登录表单。当我尝试运行我的应用程序时。线程将在intent的帮助下进入登录表单,但当涉及到AsyncTask
时,我的应用程序将显示一条强制关闭错误消息
这是我的SplashScreen
代码:
public class SplashScreen extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.splashscreen);
Thread timer = new Thread()
{
public void run()
{
try
{
sleep(5000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
finally
{
if(GoGolfPref.getEmail(SplashScreen.this)!=null && GoGolfPref.getPass(SplashScreen.this)!=null)
{
new LoadingScreen(SplashScreen.this, SplashScreen.this).execute("login_page", Login.url+GoGolfPref.getEmail(SplashScreen.this)+"/"+GoGolfPref.getPass(SplashScreen.this));
}
else
{
Intent in = new Intent(SplashScreen.this, Login.class);
startActivity(in);
finish();
}
}
}
};
timer.start();
}
}
这就是我得到的错误:
08-29 07:25:58.040: E/AndroidRuntime(2365): FATAL EXCEPTION: Thread-10
08-29 07:25:58.040: E/AndroidRuntime(2365): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
08-29 07:25:58.040: E/AndroidRuntime(2365): at android.os.Handler.<init>(Handler.java:121)
08-29 07:25:58.040: E/AndroidRuntime(2365): at android.app.Dialog.<init>(Dialog.java:101)
08-29 07:25:58.040: E/AndroidRuntime(2365): at android.app.AlertDialog.<init>(AlertDialog.java:63)
08-29 07:25:58.040: E/AndroidRuntime(2365): at android.app.ProgressDialog.<init>(ProgressDialog.java:80)
08-29 07:25:58.040: E/AndroidRuntime(2365): at android.app.ProgressDialog.<init>(ProgressDialog.java:76)
08-29 07:25:58.040: E/AndroidRuntime(2365): at com.pnf.gogolf.LoadingScreen.<init>(LoadingScreen.java:130)
08-29 07:25:58.040: E/AndroidRuntime(2365): at com.pnf.gogolf.SplashScreen$1.run(SplashScreen.java:32)
08-29 07:25:58.040:E/AndroidRuntime(2365):致命异常:线程10
08-29 07:25:58.040:E/AndroidRuntime(2365):java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序
08-29 07:25:58.040:E/AndroidRuntime(2365):位于android.os.Handler.(Handler.java:121)
08-29 07:25:58.040:E/AndroidRuntime(2365):在android.app.Dialog.(Dialog.java:101)
08-29 07:25:58.040:E/AndroidRuntime(2365):在android.app.AlertDialog.(AlertDialog.java:63)
08-29 07:25:58.040:E/AndroidRuntime(2365):在android.app.ProgressDialog.(ProgressDialog.java:80)
08-29 07:25:58.040:E/AndroidRuntime(2365):在android.app.ProgressDialog.(ProgressDialog.java:76)
08-29 07:25:58.040:E/AndroidRuntime(2365):在com.pnf.gogolf.LoadingScreen.(LoadingScreen.java:130)
08-29 07:25:58.040:E/AndroidRuntime(2365):在com.pnf.gogolf.SplashScreen$1.run(SplashScreen.java:32)
如何让它工作
提前感谢…问题是您正在某个地方对UI进行更改,但这些更改不是在UI线程上完成的。任何与用户界面有关的操作都必须在UI线程上完成。您可以通过将代码封装在另一个runnable中并调用runOnUiThread()来实现这一点:
使用处理程序而不是线程的最佳实践,因为处理程序可以在执行期间在UI中更改
要了解更多关于处理程序和线程的信息,只需检查此项没有人愿意等待大约5秒钟,让您的应用程序启动,移动平台尤其如此。所以不要这样做。同意@mimicotopus-read“闪屏是邪恶的,不要使用它们!”我的客户想要这个闪屏,这就是为什么我必须在应用程序中实现它,所以你能告诉我如何启动runOnUiThread()@mimicotopus.你能给我一个例子吗,我在线程方面是新手。。。如何开始这个runnable()?我面临着同样的问题,所以我更愿意在这里要求一些澄清。你能告诉我最终的代码是什么样子吗?
runOnUiThread(new Runnable() {
@Override
public void run() {
// set some text views or something
}
}