8

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

所以我的问题是,Android 中是否有类似的策略?这是我的代码。参数runnable是一些耗时的代码。此方法将在执行期间显示一个等待对话框,然后期望在完成后显示一个 Toast。但是 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系统的一些话吗?比如它是不是线程安全的,线程如何协同工作等等。非常感谢!

4

6 回答 6

7

您可以像这样使用 AsyncTask。

调用 AsyncTask

new getAsynctask().execute("");

这是获取结果的类。

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);
        }
    }
}
于 2012-02-07T09:01:37.030 回答
7

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

  • 异步任务-

AsyncTask 允许正确和轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。Example for using AsyncTask

  • 服务-

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

  • 意向服务-

IntentService 是按需处理异步请求(表示为 Intent)的服务的基类。客户端通过 startService(Intent) 调用发送请求;该服务根据需要启动,使用工作线程依次处理每个 Intent,并在工作结束时自行停止。Example for using IntentService.

于 2012-02-07T09:01:48.753 回答
2

您将此 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
        }
    }
于 2012-02-07T08:59:05.783 回答
2

使用处理程序:

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;
        }
    }
};
于 2012-02-07T08:59:52.370 回答
2

每当您使用不是您的 UI 线程的独立线程时,最好的方法是使用 Handler。每当您想从您的线程中亲密用户时,假设一个进度然后向 Handler 发送一条消息。在 Handler 中,您可以处理消息并编写代码片段来更改 UI 上的任何内容。这是 Android 的首选方式。看到这些链接1 ,链接2和链接3

于 2012-02-07T08:57:59.950 回答
1

android 开发者资源中的Painless threading 文章根据特定的 SDK 版本提供了不同的替代方案。

于 2012-02-07T08:58:51.277 回答