2016-10-28 3 views
0

マルチスレッドの手法を使用してWebコンテンツをダウンロードしようとしています。私は自分のコードが正しいと信じているように、オンラインアンドロイド開発チュートリアルサービスに従っています(完全なアンドロイドWeb開発コース第5章)。しかし、要求に応じてWebページの一部をログに表示した後、次のメッセージが表示されます。Android - ダウンロードWebコンテンツエラー - スキップしたXフレーム!アプリケーションがメインスレッドであまりにも多くの作業をしている可能性があります

"I/Choreographer:743フレームをスキップしました!アプリケーションがメインスレッドで処理している可能性があります。

私はAsynTaskを使用していますが、まだ運がありません。

public class MainActivity extends AppCompatActivity { 

    public class DownloadTask extends AsyncTask<String, Void, String> { 

     @Override 
     protected String doInBackground(String... urls) {/


      String result = ""; 
      URL url; 
      HttpURLConnection urlConnection = null; 

      try{ 
       url = new URL(urls[0]); 

       urlConnection = (HttpURLConnection) url.openConnection(); 

       InputStream in = urlConnection.getInputStream(); 

       InputStreamReader reader = new InputStreamReader(in); 

       int data = reader.read(); 

       while (data != -1) { 
        char current = (char) data; 

        result += current; 

        data = reader.read(); 
       } 
       return result; 
      } 
      catch(Exception e) { 
       e.printStackTrace(); 
       return "Failed"; 
      } 


     } 

    } 

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

     DownloadTask task = new DownloadTask(); 
     String result = null; 
     try { 
      result = task.execute("http://www.w3schools.com/html/tryit.asp?filename=tryhtml_basic_document").get(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } 

     Log.i("Contents of URL", result); 
    } 
} 
+0

は、このコードはコンパイルあなたは確かにいますか? Executeは結果の型ではなく、それ自身を返します。したがって、resultへの代入はコンパイルエラーを引き起こすはずです。結果の型を返す場合、非同期ではありません。 – deekay

答えて

1

さて、あなたはonCreate()方法で直接AsyncTask.get()メソッドをコールしなければ、あなたはちょっと浮気している、コードは実際にUIスレッドで実行されているので!

あなたは本当に、これは結果を待つため、UIスレッドをブロックしますので、私はあなたがしたかったので、あなたはこれをしたと思います

を(あなたが避けたい正確に何をしている)、get()は呼び出してはいけませんonCreate()メソッドで結果を得ることはできますが、できません。

一般的に、結果はUIフィールド(TextViewなど)に表示する必要があります。この場合、Handlerインスタンスを使用して、UIスレッドの値を再度使用する必要があります。


修正されたコード:

public class MainActivity extends AppCompatActivity { 

    public class DownloadTask extends AsyncTask<String, Void, String> { 

     @Override 
     protected void onPostExecute(Result result) { 
      Log.i("Contents of URL", result); 
     } 

     @Override 
     protected String doInBackground(String... urls) { 


      String result = ""; 
      URL url; 
      HttpURLConnection urlConnection = null; 

      try{ 
       url = new URL(urls[0]); 

       urlConnection = (HttpURLConnection) url.openConnection(); 

       InputStream in = urlConnection.getInputStream(); 

       InputStreamReader reader = new InputStreamReader(in); 

       int data = reader.read(); 

       while (data != -1) { 
        char current = (char) data; 

        result += current; 

        data = reader.read(); 
       } 
       return result; 
      } 
      catch(Exception e) { 
       e.printStackTrace(); 
       return "Failed"; 
      } 


     } 

    } 

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

     DownloadTask task = new DownloadTask(); 
     task.execute("http://www.w3schools.com/html/tryit.asp?filename=tryhtml_basic_document"); 

    } 
} 
関連する問題

 関連する問題