我有这个Runnable
Runnable serverChecksRunnable = new Runnable()
{
@Override
public void run()
{
if (connectedSuccess == true)
{
checkServer = Get(iptouse + "uploadstatus");
}
Handler h=new Handler(Looper.getMainLooper());
h.post(new Runnable()
{
@Override
public void run()
{
if (connectedSuccess)
{
if (checkServer != null)
{
String a = null;
try
{
a = new String(checkServer, "UTF-8");
textforthespeacch = a;
{
String varr = textforthespeacch.substring(17,3);
String varr1 = textforthespeacch.substring(0, 16);
String varr2 = textforthespeacch.substring(21);
textforthespeacch = varr1;
status1.setText("Upload completed" + " " + varr + "%");
timerValue.setText("00:00:" + varr2);
numberofuploadedfilescounter += 1;
uploadedfilescount.setText(("Uploaded Files: " + numberofuploadedfilescounter));
MainActivity.this.initTTS();
}
if (textforthespeacch.contains("uploading"))
{
String[] split = textforthespeacch.split(" ");
textforthespeacch = split[0];
status1.setText("Uploading" + " " + split[1] + "%");
servercheckCounter += 1;
if (servercheckCounter == 1)
{
MainActivity.this.initTTS();
}
}
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
}
}
}
});
customHandler.postDelayed(serverChecksRunnable,1000);
}
};
var textforthespeacch是字符串并从Web服务器获取文本。 然后我检查它何时包含文本的一部分,将文本部分分配给三个变量:
if (textforthespeacch.contains("upload completed"))
{
String varr = textforthespeacch.substring(17,3);
String varr1 = textforthespeacch.substring(0, 16);
String varr2 = textforthespeacch.substring(21);
问题是程序在第一个子串(17,3)上崩溃
textforspeech中的文字是:"上传完成100 0"数字100表示百分比,并且将始终为100.而数字0表示可以更改的秒数有时为0,有时为1,有时为34.5
在varr中,我需要将100作为字符串" 100" 在varr1"上传完成" 在varr2" 0"
varr2可能会更改为" 0"或" 1"或" 45.5"其他人varr和varr1永远不会改变文本" 100"并且"上传完成"永远不会改变。
这是logcat中的异常消息:
09-15 18:45:45.435 5583-5583/com.test.webservertest E/AndroidRuntime﹕ FATAL EXCEPTION: main
Process: com.test.webservertest, PID: 5583
java.lang.StringIndexOutOfBoundsException: length=22; regionStart=17; regionLength=-15
at java.lang.String.startEndAndLength(String.java:504)
at java.lang.String.substring(String.java:1333)
at com.adilipman.webservertest.MainActivity$2$1.run(MainActivity.java:235)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:135)
at android.app.ActivityThread.main(ActivityThread.java:5274)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704)
答案 0 :(得分:1)
使用此行
String varr = textforthespeacch.substring(17,2);
substring
来电中的第一个值必须小于第二个值。这就是你得到regionLength=-15
的原因。
答案 1 :(得分:1)
以下是substring()
方法的语法:
public String substring(int beginIndex)
或
public String substring(int beginIndex, int endIndex)
,其中
beginIndex -- the begin index, inclusive.
endIndex -- the end index, exclusive.
endIndex
in String varr = textforthespeacch.substring(17,3);
如何小于beginIndex
。
我认为应该反过来。