1

だから私は質問があります.なぜ私の関数はでgetIt() 壊れてhttpGetを与えます. 新しいクラスを作成する必要があるため、AsyncTask を使用していません。AsyncTask を呼び出すと、UI がブロックされます。ExceptionINTERNETget

Class.java

public class loadMovies{
    public String getIt(){
        InputStream ips = null;
        JSONObject json = null;
        String get = "";
        HttpClient client = new DefaultHttpClient();
        HttpGet httpGet = new HttpGet("http://mysite/app/movies");
        try {
            HttpResponse response = client.execute(httpGet);
            ips = response.getEntity().getContent();

            BufferedReader buffer = new BufferedReader(new InputStreamReader(ips));
            StringBuilder builder = new StringBuilder();
            String line;

            while((line = buffer.readLine()) != null){
                builder.append(line+"\n");
            }
            json = new JSONObject(builder.toString());
            Log.d(TAG, json.toString());
        }
        catch(Exception e){ e.printStackTrace(); }

        if(json != null){
            JSONArray array = json.optJSONObject("data").optJSONArray("movies");

            for(int i = 0; i < array.length(); i++){
                JSONObject rss = array.optJSONObject(i);
                get += rss.optString("name")+"\n";
            }
        }
        return get;
    }       
}
4

3 に答える 3

1

アプリが Android バージョン 3.0 以降でクラッシュする理由は、HoneyComb、Ice Cream Sandwich、および JellyBean が UI スレッドに対する悪用に対してより厳格であるためです。たとえば、HoneyComb 以降を実行している Android デバイスが UI スレッドでネットワーク アクセスを検出すると、NetworkOnMainThreadException がスローされます。

E/AndroidRuntime(673): java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.example/com.example.ExampleActivity}: android.os.NetworkOnMainThreadException

これが発生する理由についての説明は、Android 開発者のサイトに詳しく記載されています。

A NetworkOnMainThreadException is thrown when an application attempts to perform a networking operation on its main thread. This is only thrown for applications targeting the Honeycomb SDK or higher. Applications targeting earlier SDK versions are allowed to do networking on their main event loop threads, but it's heavily discouraged. 

ICS と HoneyComb が UI スレッドで実行できない他の操作の例を次に示します。

  1. Socket 接続を開く (つまり、new Socket())。
  2. HTTP リクエスト (つまり、HTTPClient および HTTPUrlConnection)。
  3. リモートの MySQL データベースに接続しようとしています。
  4. ファイルのダウンロード (つまり、Downloader.downloadFile())。

これらの操作のいずれかを UI スレッドで実行しようとしている場合は、それらをワーカー スレッドでラップする必要があります。これを行う最も簡単な方法は、AsyncTask を使用することです。これにより、ユーザー インターフェイスで非同期作業を実行できます。AsyncTask はワーカー スレッドでブロッキング操作を実行し、結果を UI スレッドに公開します。スレッドやハンドラーを自分で処理する必要はありません。

于 2013-01-05T16:23:24.113 に答える
0

AsyncTask を get で呼び出すと、UI がブロックされます

ドキュメントがAsyncTask get ()について述べているように:

必要に応じて計算が完了するまで待機し、その結果を取得します。

AsyncTaskUI スレッドでメソッドを呼び出さずにUI の使用をブロックしないようにし、実行が で完了したgetときに UI を更新します。doInBackgroundonPostExecute

AsyncTask クラスを次のように作成します。

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

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

            loadMovies loadmovobj =new loadMovies();
            String strresult=loadmovobj.getIt();
            return strresult;
      }      

      @Override
      protected void onPostExecute(String result) {     

           // Update your UI here          
      }

}

UI スレッドから AsyncTask を実行します。

new LongloadMovies().execute("");
于 2013-01-05T16:16:37.923 に答える
0

メイン UI スレッドでネットワーク操作を行うことはできません。これは、別のスレッドまたは非同期タスクで行う必要があります。これについて話すtutはここにあります

于 2013-01-05T16:16:56.363 に答える