2011-08-04 5 views
0

URLを受け取り、そのテキストコンテンツをEditTextビューに表示するコードスニペットを作成しようとしています。URLからttyファイルをAndroidハニーコムのEditTextに読み込み、NetworkOnMainThreadExceptionを取得します。

Android Honeycomb: Fragment not able to start AsyncTask?

をそれが動作していないよう:これは私は、このようなAsyncTaskは、ここで説明するから自分のネットワーク呼び出しを行うような答えを与えたと思った他のリンクの周りに粉砕してきた、うまくいっていません。私がここで使ってみようとしているのは本当に一つの関数(別の関数を呼び出す関数)です。これらの機能は完全を期すために掲載されています

public static InputStream getInputStreamFromUrl(String url){ 
      InputStream contentStream = null; 

      try{ 
       HttpClient httpclient = new DefaultHttpClient(); 
       HttpResponse response = httpclient.execute(new HttpGet(url)); 
       contentStream = response.getEntity().getContent(); 
      } catch(Exception e){ 
       e.printStackTrace(); 
      } 
      return contentStream; 
     } 

    public static String getStringFromUrl(String url) { 
     BufferedReader br = new BufferedReader(new InputStreamReader(getInputStreamFromUrl(url))); 

     StringBuffer sb = new StringBuffer(); 

     try{ 
      String line = null; 

      while ((line = br.readLine())!=null){ 
      sb.append(line); 
      } 
     }catch (IOException e){ 
      e.printStackTrace(); 
     } 
     return sb.toString(); 
    } 

これらはから呼び出される私:

 retrieveURLReferenceBtn.setOnClickListener(new OnClickListener() { 
     public void onClick(View arg0) { 
       new FragmentHttpHelper().execute(); 
     } 
    }); 

をそう置くことによって:URLをフェッチするためのボタンがクリックされたときに実行される

private class FragmentHttpHelper extends AsyncTask<Void, Void, Boolean>{ 
     protected void onPostExecute(Boolean result) { 
        contractTextTxt.setText(getStringFromUrl(urlReferenceTxt.getText().toString())); 
      } 
     @Override 
     protected Boolean doInBackground(Void... params) { 
      // TODO Auto-generated method stub 
      return true; 
     }   
    } 

asynctask内のものハニカム3.0 NetworkOnMainThreadExceptionを回避しようとしていたと思ったが、そうではないようだ。どのようなアイデアを次に試すの?

答えて

1

実際のネットワークコールをAsyncTaskのdoInBackgroundメソッドに入れていないようです。これは一般的にあなたがやりたいことであり、THEN onPostExecuteが呼び出されます。 doInBackgroundで何もしないので、AsyncTaskを起動するとすぐにonPostExecuteが呼び出されると思います。

HttpClientコードをdoInBackgroundメソッドに移動してみてください。私はそのはこのように動作して伝えることができるものから、

ボタンをクリック>がAsyncTaskを呼び出し>何も>バックグラウンドスレッドで起こりませんあなたのUIに戻っている... .setText(ネットワーク呼び出し)にしようとpostExecuteを呼び出します糸。

私が間違っている場合は私を修正してください。たぶん私はこれを間違って見ている?

+0

これで、返された文字列を改行でレンダリングする方法と、 'Android'の' EditView'ビューにすべてをレンダリングする方法を理解するだけです。 – Codejoy

1

getStringFromUrlおよびgetInputStreamFromUrlは、doInBackground()で呼び出す必要があります。 doInBackground()からbooleanを返す代わりに、テキストを返してonPostExecuteのテキストビューに設定することができます。 doInBackground()メソッドのみが新しいスレッドで実行されるため、ここでネットワーク関連のすべての処理を行い、UIをonPostExecute()に更新する必要があります。

関連する問題