【发布时间】:2015-04-17 15:19:08
【问题描述】:
我在上一个问题中遇到问题,我不确定我的代码是否存在内存泄漏。一些答案与它在 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
}
}
}
它只是设置视图文本并附加5*5的结果。
我一启动应用程序,它就会自行退出,我不明白为什么。有些东西告诉我我以错误的方式延迟它或使用runOnUiThread 错误。即使将txtview.setText("Hola Mundo"+test); 更改为runOnUiThread( txtview.setText("Hola Mundo"+test) ); 也不会编译给出错误:'void' type not allowed here。
简而言之:计算(在这种情况下为5*5)应在单独的线程上完成以避免阻塞主(UI)线程,并且文本应设置在从单独线程中获取计算项的 UI 上.您自己的一个简单示例也可以。
更新
我已经发布了我自己实现AsyncTask 的问题的答案。
【问题讨论】:
-
使用 javax.swing.Timer 或 java.util.Timer 是一种很好的方法
-
为什么不使用 AsyncTask?
-
@Axxiss 对。我使用
AsyncTask用更新的代码回答了我自己的问题。 -
@ControlAltDel 在 Android 中使用
java.util.Timer几乎没有充分的理由,你绝对不应该使用javax.swing.Timer或任何其他 Swing 类。
标签: java android multithreading android-runonuithread