0

我在服务器上有一个文本文件(现在由 WAMP 在 c:/wamp/www/android/sample.txt 中的本地服务器上)和一个具有 3 个通过 WiFi 读取数据的活动的 android 应用程序。第一个获取地址(在本地主机上使用 10.0.2.2/android/sample.txt)并转到 activity2。在活动 2 中,我有一个转到活动 3 的按钮。

代码是第三个活动:

private InputStream OpenHttpConnection(String urlString) throws Exception {
    InputStream in = null;
    int response = -1;

    URL url = new URL(urlString);
    URLConnection conn = url.openConnection();
    if (!(conn instanceof HttpURLConnection)) {
        throw new IOException("NOT an HTTP Connection!");
    }
    try {
        HttpURLConnection httpCon = (HttpURLConnection) conn;
        httpCon.setAllowUserInteraction(false);
        httpCon.setInstanceFollowRedirects(true);
        httpCon.setRequestMethod("GET");
        httpCon.connect();
        response = httpCon.getResponseCode();
        if (response == HttpURLConnection.HTTP_OK) {
            in = httpCon.getInputStream();
            Log.d("myerr", response + "");
        }
    } catch (Exception e) {
        Log.d("myerr2", e.getLocalizedMessage());
        throw new IOException("Error Connection!");
    }
    return in;
}

private String DownloadText(String URL) {
    int BUFFER_SIZE = 2000;
    InputStream in = null;
    try {
        in = OpenHttpConnection(URL);
    } catch (Exception e) {
        Log.d("myerr", e.getLocalizedMessage());
        return "";
    }
    InputStreamReader isr = new InputStreamReader(in);
    int charRead;
    String str = "";
    char[] inputBuffer = new char[BUFFER_SIZE];
    try {
        while ((charRead = isr.read(inputBuffer)) > 0) {
            String readString = String
                    .copyValueOf(inputBuffer, 0, charRead);
            str += readString;
            inputBuffer = new char[BUFFER_SIZE];
        }
        in.close();
    } catch (Exception e) {
        Log.d("myerr", e.getLocalizedMessage());
        return "";
    }
    return str;
}

private  class DownloadTextTask extends AsyncTask<String, Void, String> {

    protected  String doInBackground(String... urls) {
        return DownloadText(urls[0]);
    }

    protected  void onPostExecute(String result) {

        Global.readedDataFromFile=result;
        //Toast.makeText(DrawRhActivity.this,"Result: "+Global.readedDataFromFile, Toast.LENGTH_LONG).show();

    }
}


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_draw_rh);

    String user_address = Global.ip_address;
    new DownloadTextTask().execute(user_address);

    tv = (TextView) findViewById(R.id.textView1);
    tv.setText("Value: " + Global.readedDataFromFile);

}

我还在 Global.java 中定义了一些全局变量。这是我的问题:第三个活动第一次没有在 textview 上显示数据。但是当我回到第二个活动并点击我的数据加载按钮时。为什么 AsyncTask 第一次不显示结果以及如何解决这个问题?

感谢您的关注。

4

4 回答 4

1
tv.setText("Value: " + Global.readedDataFromFile);

在 onPostExecute 中写下这一行

protected  void onPostExecute(String result) {

    Global.readedDataFromFile=result;
    //Toast.makeText(DrawRhActivity.this,"Result: "+Global.readedDataFromFile, Toast.LENGTH_LONG).show();
tv.setText("Value: " + Global.readedDataFromFile);

}
于 2013-05-22T06:03:11.143 回答
1

解决方案:

输入tv.setText("Value: " + Global.readedDataFromFile);你的onPostExecute方法。

解释:

AsyncTask在单独的线程而不是您的 UI 线程上运行。所以当它被执行Global.readedDataFromFile时可能是空的。当执行完成时,它进入onPostExecute方法,现在Global.readedDataFromFile有一些值存储在其中。

问题: 您在调用后立即设置文本,new DownloadTextTask().execute(user_address); 因此可能会发生AsyncTask尚未完成且Global.readedDataFromFile为空的情况。

参考: AsyncTask

我希望它会有所帮助!

于 2013-05-22T06:41:38.477 回答
0

保留您的 DownloadTextTask 并在您的活动中尝试此代码

DownloadTextTask textTask = new DownloadTextTask();
textTask.execute(user_address);
String strDownloaded = "";
try {
    strDownloaded = textTask.get();
} catch (Exception e) {
    Log.e("DownloadTextTask", "Error: " + e.getMessage());
}
于 2013-05-23T06:16:35.810 回答
0

问题在于您的onCreate功能:

String user_address = Global.ip_address;
new DownloadTextTask().execute(user_address);

tv = (TextView) findViewById(R.id.textView1);
tv.setText("Value: " + Global.readedDataFromFile);

首先你开始一个任务,然后你想设置你的视图,但是你的任务还没有完成。您必须将具有任务结果的视图设置为onPostExecute任务。

于 2013-05-22T06:06:07.067 回答