嗨,我是Java Android开发的新手,我想知道如何在Android中使用Runnable
。它似乎对我不起作用。这是我的源代码:
MainTest.java
package com.heeere.androiddnssd.discovery;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MainTest extends Activity {
android.net.wifi.WifiManager.MulticastLock lock;
private Discovery discovery = new Discovery(this);
private TextView textView;
/** Called when the activity is first created. */
@SuppressLint("NewApi") @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView = (TextView)this.findViewById(R.id.text);
android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) getSystemService(android.content.Context.WIFI_SERVICE);
lock = wifi.createMulticastLock("mylockthereturn");
lock.setReferenceCounted(true);
lock.acquire();
}
public void updateView () {
String msg = discovery.getMsg();
textView.setText(msg);
}
@SuppressLint("NewApi") @Override
protected void onStop() {
discovery.stop();
lock.release();
super.onStop();
}
}
Discovery.java
package com.heeere.androiddnssd.discovery;
import java.io.IOException;
import javax.jmdns.JmDNS;
import javax.jmdns.ServiceEvent;
import javax.jmdns.ServiceListener;
public class Discovery {
private String type = "_ikunet._tcp.local.";
private String msg="";
private JmDNS jmdns = null;
private ServiceListener listener = null;
private MainTest maintest;
android.os.Handler handler = new android.os.Handler();
public Discovery (MainTest maintest) {
this.maintest = maintest;
setUp();
}
private void setUp() {
try {
jmdns = JmDNS.create();
jmdns.addServiceListener(type, listener = new ServiceListener() {
public void serviceResolved(ServiceEvent ev) {
msg = msg + ev.getInfo().getName()+ "\n";
update();
}
public void serviceRemoved(ServiceEvent ev) {
}
public void serviceAdded(ServiceEvent event) {
jmdns.requestServiceInfo(event.getType(), event.getName(), 1);
}
});
} catch (IOException e) {
e.printStackTrace();
return;
}
}
public String getMsg() {
return msg;
}
private void update() {
handler.postDelayed(new Runnable() {
public void run() {
maintest.updateView();
}
}, 1);
}
public void stop() {
if (jmdns != null) {
if (listener != null) {
jmdns.removeServiceListener(type, listener);
listener = null;
}
jmdns.unregisterAllServices();
try {
jmdns.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
jmdns = null;
}
}
}
main.xml中
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scroller"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fillViewport="true">
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:scrollbars="vertical"
android:fadeScrollbars="true"
android:isScrollContainer="true">
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, Android Discovery" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a TextView" />
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello, I am a Button" />
</LinearLayout>
</ScrollView>
serviceResolved
在应用程序启动后的一段时间内从Discovery
类执行,并应更新textview
(来自MainTest
类)。但这不会发生。我该如何解决这个问题?我认为这可能是Runnable
问题。
答案 0 :(得分:4)
您可以跳过使用Runnable
,因为在Discovery.java中似乎没有必要。例如:
private void update() {
maintest.updateView();
}
但是,如果您使用线程收集搜索结果,那么您可以做的是在您的活动类(MainTest.java)中使用runOnUiThread
。例如:
public void updateView () {
this.runOnUiThread(new Runnable() {
@Override
public void run() {
String msg = discovery.getMsg();
textView.setText(msg);
}
});
}
答案 1 :(得分:4)
试试这个
private void update() {
final Runnable r = new Runnable() {
public void run() {
maintest.updateView();
handler.postDelayed(this, 1000);
}
};
handler.postDelayed(r, 1000);
}
但我建议你这样做:
private void update() {
new Thread() {
public void run() {
while (true) {
runOnUiThread(new Runnable() {
@Override
public void run() {
maintest.updateView();
}
});
Thread.sleep(1000);
}
}
}.start();
}
答案 2 :(得分:0)
就个人而言,我会稍微使用处理程序。
对我来说,Handler应该由Activity创建并交给你的发现类。这样做更好,因为您避免“泄漏”整个活动。
在您的活动中
private final Handler mHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
switch (msg.what)
{
case UPDATE_PROGRESS:
handleUpdateProgress();
break;
}
}
};
然后,如果您需要回发到活动,可以使用以下内容:
handlerFromActivity.obtainMessage(UPDATE_PROGRESS).sendToTarget();
答案 3 :(得分:0)
有效:)
final Handler handler = new Handler();
handler.post(new Runnable() {
@Override
public void run() {
/* ... */
handler.postDelayed(this, 15000);
}
});