我的应用程序中有一个简单的计时器,每3秒钟运行一次。如果它不在fragment类中,那么它可以完美地工作。但在片段中,我总是遇到一个错误:只有创建视图层次结构的原始线程才能接触其视图。
timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
String timeStamp = new SimpleDateFormat(
"yyyy.MM.dd HH:mm:ss").format(Calendar
.getInstance().getTime());
System.out.println("TimeStamp: " + timeStamp);
// Read And Write Register Sample
port = Integer.parseInt(gConstants.port);
String refe = "0";// HEX Address
ref = Integer.parseInt(refe, 16);// Hex to int
count = 10; // the number Address to read
SlaveAddr = 1;
astr = gConstants.ip; // Modbus Device
InetAddress addr;
try {
addr = InetAddress.getByName(astr);
con = new TCPMasterConnection(addr); // the
// connection
} catch (UnknownHostException e2) {
e2.printStackTrace();
}
// 1.Prepare the request
/************************************/
Rreq = new ReadMultipleRegistersRequest(ref, count);
Rres = new ReadMultipleRegistersResponse();
Rreq.setUnitID(SlaveAddr); // set Slave Address
Rres.setUnitID(SlaveAddr); // set Slave Address
// 2. Open the connection
con.setPort(port);
try {
con.connect();
System.out.println("Kapcsolódva!");
} catch (Exception e1) {
e1.printStackTrace();
}
con.setTimeout(2500);
// 3. Start Transaction
trans = new ModbusTCPTransaction(con);
trans.setRetries(5);
trans.setReconnecting(true);
trans.setRequest(Rreq);
try {
trans.execute();
} catch (ModbusIOException e) {
e.printStackTrace();
} catch (ModbusSlaveException e) {
e.printStackTrace();
} catch (ModbusException e) {
e.printStackTrace();
}
/* Print Response */
Rres = (ReadMultipleRegistersResponse) trans
.getResponse();
System.out.println("Connected to= " + astr
+ con.isConnected() + " / Start Register "
+ Integer.toHexString(ref));
count = 10;
for (int k = 0; k < count; k++) {
System.out.println("The value READ: "
+ Rres.getRegisterValue(k) + " "
+ Rres.getUnitID());
ki_adat = ki_adat + Rres.getRegisterValue(k) + "\n";
// Adatbázisba írás
ContentValues modbusData = new ContentValues();
modbusData.put("Value", Rres.getRegisterValue(k)); // tábla
// +
// érték
modbusData.put("timeStamp", timeStamp);
try {
gConstants.db.beginTransaction();
gConstants.db
.insert("Modbus", null, modbusData);
gConstants.db.setTransactionSuccessful();
} finally {
gConstants.db.endTransaction();
}
}
kiir.setText(ki_adat);
ki_adat = "";
}//run vége
}, 0, 3000);
您正在从另一个线程执行UI操作。我建议你使用以下方法。
runOnUiThread(new Runnable() {
@Override
public void run() {
kiir.setText(ki_adat);
}
您需要使用runOnUIThread()
函数我有一个示例,当我找到它时会发布它。
你需要给你的计时器一个MainActivity的实例,或者看看这个问题,我问过Android的图像计时问题,听起来和你想做的事情类似
public static void updateText(Activity act, resID)
{
loadingText = (TextView) activity.findViewById(R.id.loadingScreenTextView);
act.runOnUiThread(new Runnable()
{
public void run()
{
loadingText.setText(resID);
}
});
}
尝试从非UI线程的任何线程访问UI元素时,会发生此错误。
要从非UI线程访问/修改元素,请使用runOnUIThread
。
但是,当您需要在片段中更改UI元素时,应该在拥有片段的活动上调用runOnUIThread。您可以通过getActivity()完成此操作。runOnUIThread()
。
例如:
timer.schedule(new TimerTask() {
@Override
public void run() {
// Your logic here...
// When you need to modify a UI element, do so on the UI thread.
// 'getActivity()' is required as this is being ran from a Fragment.
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
// This code will always run on the UI thread, therefore is safe to modify UI elements.
myTextBox.setText("my text");
}
});
}
}, 0, 3000); // End of your timer code.
有关更多信息,请参阅以下文档:
getActivity()
)我读了其他帖子,但没有解决我的问题。我是Android的新手。我必须连接到MSSQL,但我得到了原始线程错误。我如何解决这个问题?谢谢 这是我的代码: 在KuyrugaEkle函数中,我动态更改布局,并且我在该函数中收到错误。 谢谢
这是我的主要活动: 这是我的三个片段之一,其他两个几乎相同: 当执行我得到这个错误:只有创建视图层次结构的原始线程可以触摸它的视图 那是因为我在onCreateView中创建了文本视图,但我正在setText中编辑它,对吗?问题是我需要在程序执行期间多次编辑该文本,并且我不能在onCreateView中传输我的部分代码(让它像一个单独的线程一样运行,我猜?)因为我需要按顺序从Socket检索输入。
我正在开发一个Android应用程序,我使用Eclipse作为IDE,我的数据库是MySQL。我有以下问题。当我试图通过AsynTask从数据库中获取数据时,出现了下面显示的错误。 活动: 异步任务:
得到一个错误:android.view.ViewRootImpl$CalledFromWrongThreadException:只有创建视图层次结构的原始线程可以触摸它的视图。 我真的不知道为什么。 谢谢帮忙。
我正在使用Android和PHP创建一个简单的登录应用程序,但我遇到了一个错误,有人能帮我吗?我正在尝试在Android作为客户端和PHP/MySQL作为服务器端之间建立关系,但仍然没有成功得到响应。
我正在使用MultipartEntityBuilder将图像发送到php服务器,我将图片和视频发送到设备摄像头的目录中,我需要将文件保存在新的ArrayList上并将其发送到php服务器。 总是报告错误: 我的代码 更新