我正在开发一个带有服务的Android 2.3.3应用程序.我在服务中有这个与Main活动进行通信:
public class UDPListenerService extends Service
{
private static final String TAG = "UDPListenerService";
//private ThreadGroup myThreads = new ThreadGroup("UDPListenerServiceWorker");
private UDPListenerThread myThread;
/**
* Handler to communicate from WorkerThread to service.
*/
private Handler mServiceHandler;
// Used to receive messages from the Activity
final Messenger inMessenger = new Messenger(new IncomingHandler());
// Use to send message to the Activity
private Messenger outMessenger;
class IncomingHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
}
}
/**
* Target we …Run Code Online (Sandbox Code Playgroud) android memory-leaks static-classes android-lint android-handler
我的代码中有一个变量,说它是"状态".
我想根据此变量值在应用程序中显示一些文本.这必须在特定的时间延迟下完成.
就像是,
检查状态变量值
显示一些文字
等待10秒钟
检查状态变量值
显示一些文字
等待15秒
等等.时间延迟可能会有所不同,一旦显示文本就会设置.
我试过Thread.sleep(time delay)但失败了.有没有更好的方法来完成这项工作?
我想在每5秒后重复调用一个方法,每当我想停止重复调用该方法时,我可能会停止或重新启动该方法的重复调用.
这是一些我想要实现的示例代码.请在这方面帮助我,我将非常感谢你.
private int m_interval = 5000; // 5 seconds by default, can be changed later
private Handler m_handler;
@Override
protected void onCreate(Bundle bundle)
{
...
m_handler = new Handler();
}
Runnable m_statusChecker = new Runnable()
{
@Override
public void run() {
updateStatus(); //this function can change value of m_interval.
m_handler.postDelayed(m_statusChecker, m_interval);
}
};
public void startRepeatingTask()
{
m_statusChecker.run();
}
public void stopRepeatingTask()
{
m_handler.removeCallbacks(m_statusChecker);
}
Run Code Online (Sandbox Code Playgroud) 我有一个非常简单的代码:
package com.example.conn08;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
public class MainActivity extends Activity
{
private static CustomHandler mHandler;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
updateUI();
}
private class CustomHandler extends Handler
{
@Override
public void handleMessage(Message msg)
{
MainActivity.this.updateUI();
}
public void sleep(long delayMillis)
{
this.removeMessages(0);
sendMessageDelayed(obtainMessage(0), delayMillis);
}
}
private void updateUI()
{
mHandler.sleep(1000);
Log.v("updateUI", "kokoko");
}
}
Run Code Online (Sandbox Code Playgroud)
但在
MainActivity.this.updateUI();
Run Code Online (Sandbox Code Playgroud)
我知道了
此Handler类应该是静态的,否则可能会发生泄漏(com.example.conn08.MainActivity.CustomHandler)
为什么?请帮忙
编辑代码:
package com.example.conn08;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler; …Run Code Online (Sandbox Code Playgroud) 在下面的代码中Eclipse生成警告"此Handler类应该是静态的,否则可能会发生泄漏".
public class MyActivity extends Activity implements Runnable
{
final Handler handler = new Handler()
{
@Override
public void handleMessage( Message message)
{
String sResult = (String) message.obj;
if( (sResult != null) && (sResult != ""))
{
MyNonStatic = (TableLayout) findViewById( R.id.tableLayout); // any non-static method
}
return;
}
};
public void run()
{
final Message message = handler.obtainMessage( 1, MyFunction( context));
handler.sendMessage( message);
}
public String MyFunction( Context context)
{
return "MyNewString";
}
}
Run Code Online (Sandbox Code Playgroud)
我在网站上审查了很多主题,但没有得到解决方案.请帮帮我这个代码?
添加:我需要在handleMessage()中调用非静态方法(例如findViewById())!