如何在Android UI线程中执行一些代码asynchronous?

我是Android开发的新手。 我已经在Swing和SWT工作了好几年了。 Swing和SWT都有在UI线程同步和asynchronous中执行代码的策略。 典型的用法是做一些时间 – 在一个线程中消耗工作人员,然后在UI线程asynchronous显示结果。

所以我的问题是,在Android中是否有类似的策略? 这是我的代码。 参数可运行是一些耗时的代码。 这个方法将在执行过程中显示一个等待对话框,然后在完成后显示一个Toast。 但吐司需要在UI线程中显示。 那么该怎么做?

public static void showWaitingDialog(final Activity parent, final Runnable runnable, String msg) { if (StringUtils.isEmpty(msg)) { msg = "processing..."; } final ProgressDialog waitingDialog = ProgressDialog.show(parent, "Please Wait...", msg, true); // execute in a new thread instead of UI thread ThreadPoolUtil.execute(new Runnable() { public void run() { try { // some time-consume operation runnable.run(); } catch (Exception e) { e.printStackTrace(); } finally { waitingDialog.dismiss(); } // TODO: How to display a Toast message here? execute some code in UI Thread. } }); } 

有没有关于Android UI系统的一些话? 比如它是线程安全的,线程如何协同工作等等。 非常感谢!

Solutions Collecting From Web of "如何在Android UI线程中执行一些代码asynchronous?"

有几种方法可以做到这一点,

  • AsyncTask

AsyncTask支持正确和简单地使用UI线程。 这个类允许执行后台操作并在UI线程上发布结果,而不必操作线程和/或处理程序。 Example for using AsyncTask

  • 服务

服务是一个应用程序组件,代表应用程序希望在不与用户交互的情况下执行长时间运行的操作,或者提供其他应用程序使用的function。 Example for Using Service.

  • IntentService

IntentService是一个服务的基类,用于处理asynchronous请求(表示为Intents)。 客户通过startService(Intent)调用发送请求; 该服务根据需要启动,使用工作线程处理每个Intent,并在工作不正常时自行停止。 Example for using IntentService.

你可以像这样使用AsyncTask。

调用AsyncTask

new getAsynctask().execute("");

这里是geting结果的类。

 class getAsynctask extends AsyncTask<String, Long, Integer> { protected void onPreExecute() { super.onPreExecute(); loading = ProgressDialog.show(Pass.this, null, "Please wait..."); } protected Integer doInBackground(String... params) { try { // do your coding return null; } catch (Exception e) { return null; } } protected void onPostExecute(Integer result) { super.onPostExecute(result); try { if (loading != null && loading.isShowing()) loading.dismiss(); } catch (Throwable t) { Log.v("this is praki", "loading.dismiss() problem", t); } } } 

每当你使用单独的线程而不是你的UI线程时,最好的方法就是使用Handler。 每当你想从你的线程亲密的用户,假设一个进展,然后发送一个消息处理程序如此。 在处理程序内部,您可以处理消息并编写代码片段来更改UI上的任何内容。 这是Android的首选方式。 看到这些link1 , link2 & link3

你使用这个AsynTask作为你的活动的内部类。 在后台做耗时的任务,然后在后台执行,你可以显示文本消息。 从你的主要活动中调用这个

 initTask = new InitTask(); initTask.execute(this); protected class InitTask extends AsyncTask<Context, Integer, String> { @Override protected String doInBackground(Context... params) { // Do the time comsuming task here return "COMPLETE!"; } // -- gets called just before thread begins @Override protected void onPreExecute() { super.onPreExecute(); } // -- called from the publish progress // -- notice that the datatype of the second param gets passed to this // method @Override protected void onProgressUpdate(Integer... values) { } // -- called if the cancel button is pressed @Override protected void onCancelled() { super.onCancelled(); } // -- called as soon as doInBackground method completes // -- notice that the third param gets passed to this method @Override protected void onPostExecute(String result) { super.onPostExecute(result); // Show the toast message here } } 

使用处理程序:

 static final int SHOW_TOAST = 0; public static void showWaitingDialog(final Activity parent, final Runnable runnable, String msg) { if (StringUtils.isEmpty(msg)) { msg = "processing..."; } final ProgressDialog waitingDialog = ProgressDialog.show(parent, "Please Wait...", msg, true); // execute in a new thread instead of UI thread ThreadPoolUtil.execute(new Runnable() { public void run() { try { // some time-consume operation runnable.run(); } catch (Exception e) { e.printStackTrace(); } finally { waitingDialog.dismiss(); } handler.sendMessage(handler.obtainMessage(SHOW_TOAST)); } }); } public Handler handler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case SHOW_TOAST: //Toast here break; } } }; 

Android开发人员资源中的无痛线程文章根据特定的SDK版本提供了不同的替代方法。