java - 当 Runnable 在 UI 线程上运行不是一个选项时,如何延迟生成的线程?

标签 java android multithreading android-runonuithread

我在上一个问题中遇到了问题,我不确定我的代码是否存在内存泄漏。一些答案与它在 UI 线程上运行并因此阻塞有关。是的,它在 UI 线程上运行并且不会产生新线程..

因此,为了解决这个问题,我使用 Thread 而不是 Handler 在 UI 之外生成一个新线程。现在的问题是我无法像在 UI 线程中运行的那样设法延迟它。

这是我之前的问题,我的原始 UI 线程代码是:Is this Runnable safe from memory leak?以下是生成新线程的更新代码:

package com.example.helloworld;

import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.TextView;
import android.util.Log;
import java.lang.ref.WeakReference;

public class HelloWorldActivity extends Activity
{

    private static TextView txtview;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        txtview = (TextView) findViewById(R.id.mainview);

        Thread t = new Thread(new WeakRunnable(txtview));
        t.start();
    }

    private static final class WeakRunnable implements Runnable {
        private final WeakReference<TextView> mtextview;

        protected WeakRunnable(TextView textview){
            mtextview = new WeakReference<TextView>(textview);
        }

            @Override
            public void run() {
                TextView textview = mtextview.get();
                if (textview != null) {

                    try {
                        Thread.sleep(1500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    int test = 5*5;
                    txtview.setText("Hola Mundo"+test);
                }
                Log.d("com.example.helloworld", "" + Thread.currentThread().getName()); // Outputs "Thread-<num>" if not running on UI thread
            }
    }           

}

它只是设置 View 文本并附加 5*5 的结果。

我一启动该应用程序,它就自行退出,我不明白为什么。有些事情告诉我我以错误的方式延迟它或使用错误的runOnUiThread。即使将 txtview.setText("Hola Mundo"+test); 更改为 runOnUiThread( txtview.setText("Hola Mundo"+test) ); 也不会编译给出错误: 此处不允许使用“void”类型

简而言之:计算(在本例中为 5*5)应该在单独的线程上完成,以避免阻塞主 (UI) 线程,文本应该在 UI 上设置来自单独线程的计算项。您自己的一个简单示例也可以。

更新 我已经发布了我自己的实现 AsyncTask 问题的答案。

最佳答案

使用 Handler 中的 postDelayed 方法类和 Views

改变,

    Thread t = new Thread(new WeakRunnable(txtview));
    t.start();

到:

    txtview.postDelayed(new WeakRunnable(txtview), 1500);

然后在你的 runnable 中删除下面的 sleep 子句,因为它不再需要了

                try {
                    Thread.sleep(1500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

关于java - 当 Runnable 在 UI 线程上运行不是一个选项时,如何延迟生成的线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29703226/

相关文章:

java - 使用模拟器通过 Retrofit 将我的 REST API 与 Android Studio 连接起来

java - 什么java语句或函数来格式化尼日利亚奈拉货币的货币

android - 无法在未调用 Looper.prepare() 的线程上 toast

java - Oracle Java - 如何锁定一行以使其他进程无法读取它?

java - 实现返回类型为 Class<T1<T2>> 的抽象方法

java - Runtime.getRuntime().exec ("C:\cygwin\bin\bash.exe") 没有可读取的输入

安卓工作室 : How to force re-installation (Disable instant run for once)?

android - 单一 Intent 共享音频和文本

multithreading - 我可以在工作线程中执行 TDataSet.DisableControls 而不用 Synchronize() 包装它吗?

java - Session.sendToTarget() 是线程安全的吗?