0

私のアプリのJAVAコードは次のとおりです。

public class Main extends Activity {

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

    new GetUrl().execute(20);

}
private class GetUrl extends AsyncTask<Integer, Integer, BufferedReader> {

    @Override
    protected BufferedReader doInBackground(Integer... params) {
        BufferedReader reader = null;
        try {
            URL url = null;
            url = new URL("http://www.google.com");
            URLConnection conn = url.openConnection();
            reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

        }
        catch (Exception e) {
            TextView tv = (TextView) findViewById(R.id.textView1);
            tv.setText("Error");
        }
        return reader;
    } 
    @Override
    protected void onPostExecute(BufferedReader reader) {
        TextView tv = (TextView) findViewById(R.id.textView1);
        String line = null;

        try {
            line = reader.readLine().toString();    /*This line if removed removes the error. Whenever i try to work with the reader, it stops working for 4.2.2 but works fine for 2.3.3*/
            tv.setText(line);


        }
        catch( Exception e) {
            tv.setText(e.getMessage());
        }

    }

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
}

}

リーダーを操作しようとすると、4.2.2 では機能しなくなりますが、2.3.3 では正常に機能します。以前に同様の質問を投稿し、asyncTask を使用して問題を解決するように求められましたが、実際には役に立ちませんでした。

4

1 に答える 1

0

バックグラウンド スレッドで実行される doInBackground メソッドでのみリーダーにアクセスする必要があります。

onPostExecute メソッドは UI スレッドで実行され、UI を更新するだけで、他の作業は行いません。

したがって、 AsyncTask を次のように変更することをお勧めします

AsyncTask<Integer, Integer, String> 

ラインを移動

reader.readLine().toString();

onPostExecute に、doInBackground から文字列を返し、onPostExecute へのパラメーターを読み取った文字列にします。

于 2013-05-16T04:02:04.550 に答える