Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.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 如何从线程打开AsyncTask_Android_Multithreading_Android Activity_Android Asynctask - Fatal编程技术网

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
  }
}