我在上一个问题中遇到了问题,我不确定我的代码是否存在内存泄漏。一些答案与它在 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/