Lau*_*nen 239

你可以通过调用一个做到这一点ActivityrunOnUiThread,从你的线程方法:

activity.runOnUiThread(new Runnable() {
    public void run() {
        Toast.makeText(activity, "Hello", Toast.LENGTH_SHORT).show();
    }
});
Run Code Online (Sandbox Code Playgroud)

  • "活动"是否在其构造函数中传递给非ui线程?在单独的线程中获取正在使用的活动对象的正确方法是什么? (13认同)
  • 有时无法访问```Activity```实例,你可以使用简单的helper-class,请看这里:http://stackoverflow.com/a/18280318/1891118 (5认同)
  • 我经常发现`MyActivity.this.runOnUiThread()`在内部`Thread` /`AsyncTask`中工作得很好. (5认同)

mja*_*ard 60

我喜欢在我的活动中有一个方法showToast,我可以从任何地方打电话......

public void showToast(final String toast)
{
    runOnUiThread(() -> Toast.makeText(MyActivity.this, toast, Toast.LENGTH_SHORT).show());
}
Run Code Online (Sandbox Code Playgroud)

然后,我经常MyActivity在任何这样的线程上从内部调用它...

showToast(getString(R.string.MyMessage));
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,我现在正在添加这些大多数活动. (3认同)

Chr*_*sCM 26

这与其他答案类似,但是针对新的可用api进行了更新,并且更加清晰.此外,不假设您处于活动上下文中.

public class MyService extends AnyContextSubclass {

    public void postToastMessage(final String message) {
        Handler handler = new Handler(Looper.getMainLooper());

        handler.post(new Runnable() {

            @Override
            public void run() {
                Toast.makeText(getContext(), message, Toast.LENGTH_LONG).show();
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*ren 14

一种可以在任何地方工作的方法,包括从没有Activity或者的地方开始工作View,就是抓住Handler主线程并显示toast:

public void toast(final Context context, final String text) {
  Handler handler = new Handler(Looper.getMainLooper());
  handler.post(new Runnable() {
    public void run() {
      Toast.makeText(context, text, Toast.DURATION_LONG).show();
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

这种方法的优点是它适用于任何Context,包括ServiceApplication.


yan*_*nko 10

这样这样,与Runnable显示的Toast.也就是说,

Activity activity = // reference to an Activity
// or
View view = // reference to a View

activity.runOnUiThread(new Runnable() {
    @Override
    public void run() {
        showToast(activity);
    }
});
// or
view.post(new Runnable() {
    @Override
    public void run() {
        showToast(view.getContext());
    }
});

private void showToast(Context ctx) {
    Toast.makeText(ctx, "Hi!", Toast.LENGTH_SHORT).show();
}
Run Code Online (Sandbox Code Playgroud)


Rav*_*abu 6

有时,您必须从另一个Thread线程向UI线程发送消息.当您无法在UI线程上执行网络/ IO操作时,会发生这种情况.

下面的示例处理该场景.

  1. 你有UI线程
  2. 您必须启动IO操作,因此无法Runnable在UI线程上运行.所以发布你Runnable的处理程序HandlerThread
  3. 从中获取结果Runnable并将其发送回UI线程并显示Toast消息.

解:

  1. 创建一个HandlerThread并启动它
  2. 创建一个处理程序活套来自HandlerThread:requestHandler
  3. 从主线程创建一个带Looper的处理程序: responseHandler和覆盖handleMessage方法
  4. post一项Runnable任务requestHandler
  5. 里面Runnable的任务,呼吁sendMessageresponseHandler
  6. 这个sendMessage结果调用handleMessageresponseHandler.
  7. 从中获取属性Message并对其进行处理,更新UI

示例代码:

    /* Handler thread */

    HandlerThread handlerThread = new HandlerThread("HandlerThread");
    handlerThread.start();
    Handler requestHandler = new Handler(handlerThread.getLooper());

    final Handler responseHandler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            //txtView.setText((String) msg.obj);
            Toast.makeText(MainActivity.this,
                    "Runnable on HandlerThread is completed and got result:"+(String)msg.obj,
                    Toast.LENGTH_LONG)
                    .show();
        }
    };

    for ( int i=0; i<5; i++) {
        Runnable myRunnable = new Runnable() {
            @Override
            public void run() {
                try {

                    /* Add your business logic here and construct the 
                       Messgae which should be handled in UI thread. For 
                       example sake, just sending a simple Text here*/

                    String text = "" + (++rId);
                    Message msg = new Message();

                    msg.obj = text.toString();
                    responseHandler.sendMessage(msg);
                    System.out.println(text.toString());

                } catch (Exception err) {
                    err.printStackTrace();
                }
            }
        };
        requestHandler.post(myRunnable);
    }
Run Code Online (Sandbox Code Playgroud)

有用的文章:

handlerthreads和 - 为什么 - 你 - 应该待使用了他们,在你的Android的应用程序

Android的尺蠖处理程序,handlerthread-I


小智 5

  1. 获取UI线程处理程序实例并使用 handler.sendMessage();
  2. 通话post()方式handler.post();
  3. runOnUiThread()
  4. view.post()