从网上阅读文本文件

时间:2014-08-22 06:34:54

标签: android file

我恢复了我的文本文件,我的文本包含第一个“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();
}

}

提前谢谢。

3 个答案:

答案 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+"]"

您将看到正在解析的内容。也许在开头或结尾都有一个空格。此外,服务器可能返回错误的值或空字符串。