我恢复了我的文本文件,我的文本包含第一个“1”。我试图将我的文本“1”(char)转换为int,但它给出了错误。我使用了方法Integer.parseInt(String)
这是我的代码: MainActivity.java
package mypackage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends Activity {
PackageInfo pinfo;
String contentFichier;
TextView txt;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recoverContentTextFile();
txt = (TextView) findViewById(R.id.txt);
try {
pinfo = getPackageManager().getPackageInfo(getPackageName(), 0);
} catch (NameNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//Here error
int i = Integer.parseInt(contentFichier);
}
public void recoverContentTextFile() {
new Thread() {
@Override
public void run() {
String path ="my_url_text_file";
URL u = null;
try {
u = new URL(path);
HttpURLConnection c = (HttpURLConnection) u.openConnection();
c.setRequestMethod("GET");
c.connect();
InputStream in = c.getInputStream();
final ByteArrayOutputStream bo = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
in.read(buffer); // Read from Buffer.
bo.write(buffer); // Write Into Buffer.
runOnUiThread(new Runnable() {
@Override
public void run() {
contentFichier = bo.toString();
try {
bo.close();
} catch (IOException e) {
e.printStackTrace();
}
}
});
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
}
}
提前谢谢。
答案 0 :(得分:1)
首先,根据您在方法recoverContextTextFile
中实施的方式使用线程并不是一个好主意。如果用户旋转设备并且请愿需要8分钟才能完成,会发生什么?你创建了内存泄漏!
第二件事,因为你创建了一个线程,变量contentFichier
有时会为null(因为recoverContextTextFile
会创建一个线程)并且调用Integer.parseInt(contentFichier);
会引发异常。
对于这种情况,我认为使用AsyncTask(which I highly dislike并在轮换发生时注意不泄漏活动)会更好,请在onBackground
方法中进行请求,在方法onPostExecute
中调用Integer.parseInt(contentFichier);
。
Lars Vogel的recommend reading this tutorial,因为它解释了很多关于后台处理的内容。
答案 1 :(得分:1)
这里的问题可能是您在线程完成之前尝试转换String。此外,Android有比Thread更好的方式来处理大多数(简单)后台任务AsyncTask。你可以这样做:
public class MainActivity extends Activity {
PackageInfo pinfo;
String contentFichier;
TextView txt;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Setup your activity here
new ContentFetcher().execute("http://......");
}
private class ContentFetcher extends AsyncTask<String, Void, String>{
@Override
protected String doInBackground(String... params) {
String stringResponse = null;
try{
HttpResponse httpResponse = new DefaultHttpClient().execute(new HttpGet(params[0]));
stringResponse = EntityUtils.toString(httpResponse.getEntity());
} catch (IOException ignored) {
}
return stringResponse;
}
@Override
protected void onPostExecute(String s) {
//DO something with the response here - maybe test if the s variable is indeed an integer
int i = Integer.parseInt(s);
}
}
}
执行任务运行:
new ContentFetcher().execute("http://whatever.com/mytext.txt");
答案 2 :(得分:0)
添加日志语句以显示contentFichier
:
Log.i("contentFichier", "["+contentFichier+"]"
您将看到正在解析的内容。也许在开头或结尾都有一个空格。此外,服务器可能返回错误的值或空字符串。