gpt4 book ai didi

java - Android Thread.start() CalledFromWrongThreadException

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:58 26 4
gpt4 key购买 nike

我不确定我的低估是否正确,因为我没有得到预期的输出。我有一个类,我在其中调用一个应该启动线程的方法。

public class MainActivity extends Activity {

protected void onCreate(Bundle savedInstanceState) {
beginListenForData()
}

beginListenForData 函数是启动一个线程并时常检查是否有数据可供读取。如果是这种情况,它会读取并更新一个 UI 变量:

void beginListenForData()
{
Thread workerThread = new Thread(new Runnable() {
@Override
public void run()
{
int bytesAvailable = 3;
while(!Thread.currentThread().isInterrupted())
{
try
{
bytesAvailable = mmInStream.available();
if(bytesAvailable > 0)
{
byte[] packetBytes = new byte[bytesAvailable];
mmInStream.read(packetBytes);
bytesAvailable = mmInStream.available();
String s = new String(packetBytes);
text.setText(s);
}
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
});

workerThread.start();
}

}

我没有得到想要的输出。该线程应读取数据或检查数据是否可用。如果可用,则读取它并将 UI 变量设置为读取的值。

我的实现是否正确?我的代码有问题吗?

最佳答案

一个普通的线程 should not access the UI thread .我建议使用 AsyncTask 而不是在 Android 中使用标准线程或 Runnable。 AsyncTask 可用于同时脱离 UI 线程工作,然后对其进行更改。 doInBackground() 方法中调用的所有内容都在主 UI 线程之外完成,onPreExecute()onPostExecute() 中调用的所有内容方法可以与您的 UI 很好地交互。

AsyncTask 当您从运行在 UI 线程上的某物调用新线程时(如您的实例中的 Activity),建议您使用 AsyncTask。下面的示例;

public class YourAsyncTask extends AsyncTask{

@Override
protected Object doInBackground(Object... arg0) {
// Work to be done in the background.
return null;
}

@Override
protected void onPostExecute(String result) {
// Changes to be made to UI
}

@Override
protected void onPreExecute() {
// Changes to be made to UI
}

}

然后你可以像这样从你的 Activity 中运行AysncTask;

new YourAsyncTask().execute("");

要处理您的Activity,您可能需要为您的AysncTask 创建一个自定义构造函数,并通过构造函数将您的 Activity 实例传递给它,以存储在实例变量。我希望这会有所帮助。

更多信息;

关于java - Android Thread.start() CalledFromWrongThreadException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22714476/

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