gpt4 book ai didi

java - 在java Android中不断更新GUI

转载 作者:行者123 更新时间:2023-11-29 10:16:07 25 4
gpt4 key购买 nike

我是 Android 平台 Eclipse 中的新 Java 程序员。我正在开发一个 android 应用程序,它将通过 wifi 接口(interface)接收多播数据并将其显示在 TextView 中。数据将每 1 秒更新一次。

我有如下代码。但是我在更新 GUI 时遇到问题。在此代码中,网络接收和 gui 是在同一线程(即主线程)中完成的,这就是我的应用程序挂起的原因。

我曾尝试使用 AsynchTask 但未能成功,因为我不知道如何使用它。

package com.example.cdttiming;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.Menu;
import android.widget.EditText;



public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText Seconds;
Seconds =(EditText)findViewById(R.id.Seconds);

WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("mydebuginfo");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();

InetAddress ia = null;
byte[] buffer = new byte[65535];
MulticastSocket ms = null;
int port = 4321;
try
{
ia = InetAddress.getByName("226.1.1.1");
DatagramPacket dp = new DatagramPacket(buffer, buffer.length,ia,port);
ms = new MulticastSocket(port);
ms.setReuseAddress(true);
ms.joinGroup(ia);

while (true)
{
ms.receive(dp);
String s = new String(dp.getData(),0,dp.getLength());
Seconds.setText(s);
}
}
catch (UnknownHostException e)
{
Seconds.setText(e.getMessage());
}
catch (IOException e)
{
Seconds.setText(e.getMessage());
}
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
}

谁能告诉我如何使用上面的代码,以便我可以每秒接收数据并将其显示在 TextView 中?

先谢谢大家

最佳答案

AsyncTask 并不真正适合您的用例。如果后台任务需要持续运行,最好只启动一个新线程。在线程中使用处理程序将值传递给 UI。在处理程序的回调方法中,您可以更新图形用户界面。

有关处理程序的更多信息:

  1. http://mobileorchard.com/android-app-developmentthreading-part-1-handlers/

  2. http://www.vogella.com/articles/AndroidBackgroundProcessing/article.html

  3. http://developer.android.com/reference/android/os/Handler.html

或者谷歌搜索好的例子来实现这一点。

编辑:

好的,你需要做的是启动一个新线程,并在run方法中放入从套接字读取的部分。你在类中创建线程就像在内部类中一样:

class SocketThread extends Thread {
private final Handler mHandler;
private final WifiManager mWifiManager;
SocketThread(Handler handler, WifiManager wifiManager) {
mHandler = handler;
}
@override public void run() {
// socket code goes here
// whenever you receive a part that should update the ui,
// do something like:
final String s = new String(dp.getData(),0,dp.getLength());
mHandler.post(new Runnable() {
@override
public void run() {
update(s);
}
});
}
}

然后在您的 onCreate() 中创建一个处理程序和该线程的一个实例并启动它。

...
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText Seconds;
Seconds =(EditText)findViewById(R.id.Seconds);

WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);
Handler handler = new Handler();
SocketThread thread = new SocketThread(handler, wm);
thread.start();
...

还在您的 Activity 中定义一个方法更新。在这里您将收到要设置的文本。此方法将如下所示:

public void update(String s) {
Seconds.setText(s);
}

我建议您将秒变量(edittext)保存为全局类变量。这样您就可以从更新方法写入它,而不必先findById它。

我稍微编辑了你的代码,它可能与 wifi 代码有关。我不熟悉框架的这一部分。但我可以想象它与 WifiManager 和连接到它有关。如果这不起作用,请设置一个断点并单步执行它,您会看到它停止执行任何操作的位置。

package com.example.timing;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.net.UnknownHostException;

import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
EditText Seconds;
String s;
Button button;
byte[] buffer = new byte[65535];
InetAddress ia = null;
int port = 4321;
DatagramPacket dp = new DatagramPacket(buffer, buffer.length,ia,port);
MulticastSocket ms = null;

protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Seconds = (EditText) findViewById(R.id.et_time);
WifiManager wm = (WifiManager)getSystemService(Context.WIFI_SERVICE);

Handler handler = new Handler();
SocketThread thread = new SocketThread(handler, wm);
thread.start();
}



class SocketThread extends Thread {
private final Handler mHandler;

SocketThread(Handler handler, WifiManager wifiManager) {
mHandler = handler;
}
@Override
public void run() {
// socket code goes here
try {
wm.setWifiEnabled(true);
WifiManager.MulticastLock multicastLock = wm.createMulticastLock("multicastLock");
multicastLock.setReferenceCounted(true);
multicastLock.acquire();

ia = InetAddress.getByName("226.1.1.1");
ms.setReuseAddress(true);
ms.joinGroup(ia);

while(true) {
ms.receive(dp);
s = new String(dp.getData(),0,dp.getLength());
update(s);
}
} catch (UnknownHostException e) {
update(e.getMessage());
} catch (IOException e) {
update(e.getMessage());
}
}
}


public void update(String s)
{
Seconds.setText(s);
}

@Override
public boolean onCreateOptionsMenu(Menu menu)
{
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}


}

关于java - 在java Android中不断更新GUI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17631795/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com