0

サーバー上にテキスト ファイル (現在は c:/wamp/www/android/sample.txt の WAMP によるローカル サーバー上) と、WiFi 経由でデータを読み取る 3 つのアクティビティを含む Android アプリケーションがあります。最初のものはアドレスを取得し (ローカル ホストでは 10.0.2.2/android/sample.txt を使用)、activity2 に移動します。アクティビティ 2 には、アクティビティ 3 に移動するボタンがあります。

コードは 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 でいくつかのグローバル変数を定義します。そして、ここに私の問題があります:3番目のアクティビティは、最初はテキストビューにデータを表示しません。しかし、2 番目のアクティビティに戻ってボタンを押すと、データが読み込まれました。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

説明:

AsyncTaskUI スレッドではなく別のスレッドで実行されます。そのため、実行中Global.readedDataFromFileは空である可能性があり、実行が完了するとonPostExecuteメソッドに入り、Global.readedDataFromFile値が格納されます。

問題: 呼び出し後すぐにテキストを設定しているため、まだ完了しておらず、空new DownloadTextTask().execute(user_address); である可能性があります。AsyncTaskGlobal.readedDataFromFile

参考: AsyncTask

参考になれば幸いです!!

于 2013-05-22T06:41:38.477 に答える
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 に答える