0

それで、私はクライアント用のアプリケーションを作成してネットワーク部分に到達しました。現在、マニフェストから targetSDK タグを削除しているため、MainThreadException は発生しません。メインスレッドでは遅いので、ネットワーク操作を行うべきではないと言っている人やドキュメントを見てきました...

質問: メイン スレッドではなく、どこでどのようにネットワーク操作を行うのですか? コードは次のとおりです。

  public static class MagFragment extends Fragment {
    public static final String ARG_MAGAZINE_NUMBER = "magazine_number";

    public MagFragment() {
        // Empty constructor required for fragment subclasses
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        int i = getArguments().getInt(ARG_MAGAZINE_NUMBER);
        View rootView = inflater.inflate(R.layout.fragment_main, container, false);
        if(i != 0){
            rootView = inflater.inflate(R.layout.fragment_magazine, container, false);
            TextView magText = (TextView) rootView.findViewById(R.id.textViewMag);

            try {
                HttpClient httpclient = new DefaultHttpClient();
                HttpPost httppost = new HttpPost("http://csddata.site11.com");
                HttpResponse response = httpclient.execute(httppost);

                HttpEntity httpEntity = response.getEntity();
                InputStream inputstream = httpEntity.getContent();
                try{

                    BufferedReader reader = new BufferedReader(new InputStreamReader(inputstream,"iso-8859-1"),8);
                    magText.setText(reader.readLine());

                }catch (Exception e){
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }


            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
        }

        String magazine = getResources().getStringArray(R.array.magazine_array)[i];
        Log.d("MagFragment", "MagNumber" + i);

        getActivity().setTitle(magazine);
        return rootView;
    }
}
4

4 に答える 4

1

いいえ、いいえ、いいえ、スレッド化と非同期タスクについて学習する場合を除き、これを自分で実装しないでください。車輪を再発明し、デバッグに何年も費やし、再試行、スレッド プール、Cookie などを処理する方法を見つけようとする代わりに、Android クラスの上に構築された既存のライブラリを使用して、すべての面倒な要素を抽象化することをお勧めします。エラーが発生しやすいコード。

Android Async Http Clientのようなものを使用する必要があります。これは、「Apache の HttpClient ライブラリの上に構築された Android 用の非同期コールバック ベースの Http クライアントです。すべてのリクエストはアプリのメイン UI スレッドの外部で行われますが、コールバック ロジックは次の場所で実行されます。コールバックと同じスレッドが、Android の Handler メッセージ パッシングを使用して作成されました。」

于 2013-05-22T21:34:16.680 に答える
0

なぜこれをしたいのですか?AsyncTask を使用してリクエストを送信します。終了後にクラスに通知しますか? コールバック リスナーを使用します。それは簡単です。

これが私の例です(テストされていません)

public void doNetworkStuff() {
    new doAsyncNetworkStuff().execute(this);
}

@Override
 public void onTaskCompleted(String str) {
}


private class doSingleRequest extends AsyncTask<Object, Void, Void> {

private HttpInterface httpInterface;

public doSingleRequest(HttpInterface httpInterface) {
    this.httpInterface = httpInterface;
}

@Override
protected void onPreExecute() {
 //do your inits and so on
}

@Override
protected Void doInBackground(Object... params) {
   //do your background network stuff
        httpInterface.onTaskCompleted(str);

    return null;
}
}

これが HttpInterface public interface HttpInterface { void onTaskCompleted(String str); です。}

それはどのように機能しますか?Callback Listener を使用してネットワーク処理を行う Asynctask を呼び出しています。これが完了すると、onTaskCompleted を持つ Callbacklistener が呼び出されます。これは、メインクラスがバッファなどで通知されることを意味します。その後、ブロックせずにすべてのものを処理できます。楽しみ。

于 2013-05-22T21:33:30.767 に答える
0

クラスAsyncTaskを使用する必要があります。メイン スレッドでは実行されませんが、メイン スレッドから呼び出すことができます。asynctask の準備が整うまでアクティビティを待機させることができます。その間、画面にプログレスバーを表示できます。

于 2013-05-22T21:15:13.160 に答える