5

こんにちは、私はJava Android開発の初心者でありRunnable、Androidでの使用方法を知りたいです。それは私のために働いていないようです。これが私のソースコードです:

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を更新する必要があります。しかし、これは起こりません。この動作を修正するにはどうすればよいですか?問題かもしれないと思います。textviewMainTestRunnable

4

4 に答える 4

6

これを試して

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();
}
于 2012-09-11T09:23:04.100 に答える
4

RunnableDiscovery.javaでは不要と思われるため、使用をスキップできます。例えば:

private void update() {
    maintest.updateView();
}

ただし、スレッドを使用して検索結果を収集している場合はrunOnUiThread、アクティビティクラス(MainTest.java)で使用することができます。例えば:

public void updateView () {
    this.runOnUiThread(new Runnable() {
        @Override
        public void run() {
            String msg = discovery.getMsg();
            textView.setText(msg);
        }
    });
}
于 2012-09-11T09:22:00.980 に答える
0

個人的には、ハンドラーの使い方が少し異なります。

私にとって、ハンドラはアクティビティによって作成され、ディスカバリ クラスに渡される必要があります。アクティビティ全体の「リーク」を回避できるため、これは優れています。

あなたが持っているであろう活動で

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();
于 2012-09-11T09:47:01.307 に答える