2013-05-22 5 views
0

그래서, 나는 클라이언트를위한 어플리케이션을 만들고 네트워크 어플리케이션에 참여했습니다. 현재 MainThreadException을받지 못하도록 manifest에서 targetSDK 태그를 제거하고 있습니다. 사람들과 설명서를 보았습니다. 네트워크 작업이 느려지는 것처럼 메인 쓰레드가 아닌데 ...메인 스레드에서 안드로이드 네트워크 사용

질문 : 메인 쓰레드에서 네트워크 작업을 수행하지 않고 어디서 어떻게합니까? 당신은 클래스 AsyncTask의 사용을해야

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; 
    } 
} 
+3

다음 내용을 읽었습니까? http://developer.android.com/training/basics/network-ops/connecting.html –

+0

다음 큰 일을하고 있다면 다음을 고려하십시오. http://developers.google. com/live/shows/474338138/;-)- –

+0

나는 스레드 클래스를 만들고, 객체를 만들고, 필요한 변수를 전달하고 시작을 호출하는 작업을 수행했습니다. 스레드에 대한 자세한 내용 http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html – LanternMike

답변

0

: 다음은 코드입니다. 기본 스레드에서 실행되지는 않지만 주 스레드에서 호출 할 수 있습니다. asynctask가 준비 될 때까지 활동을 대기시킬 수 있습니다. 그 동안 화면에 진행 막대를 표시 할 수 있습니다.

0

간단한 방법과 내가 같은 물건, 당신은 스레드 클래스를 구현할 수 해봤 http://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html

당신은 개체가 다음 스레드를 시작, 그것을 당신이해야 할 변수를 전달합니다. 당신이하고 싶은 것은 텍스트를 설정해서 텍스트를 설정해야하는 객체를 전달할 수 있고 거기에는 훨씬 더 많은 부분이없는 것처럼 보입니다. 그냥 HTTP 요청을 스레드 클래스의 실행으로 옮기십시오. 일단 스레드를 시작하면 타이밍을 보장 할 수 없으므로 조금 늦게 끝내거나 뭔가를 끝낼 수는 있지만 텍스트 뷰를 업데이트하려는 경우라면 충분할 것입니다.

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 공용 인터페이스 HttpInterface { 무효 onTaskCompleted (문자열 STR)입니다; }

어떻게 작동합니까? 콜백 리스너를 사용하여 네트워크 작업을 수행하는 Asynctask를 호출합니다. 이 작업이 완료되면 onTaskCompleted가있는 CallbackListener가 호출됩니다. 즉, 메인 클래스가 버퍼 등으로 통보를받습니다. 차단하지 않고도 모든 작업을 처리 할 수 ​​있습니다. 즐겨.

1

아니요, 아니요, 아니요, 스레딩 및 비동기 작업에 대해 배우기 전에는 직접 구현하지 마십시오. 디버깅에 휠과 지출 시대를 재발견하고 재시도, 스레드 풀, 쿠키를 처리하는 방법을 알아 내려고하지 않고, 안드로이드 클래스 위에 구축 된 기존 라이브러리를 사용하고 모든 지루하고 오류가 발생하기 쉬운 코드.

Android Async Http Client과 같은 것을 사용해야합니다. "Apache의 HttpClient 라이브러리 위에 만들어진 Android 용 비동기 콜백 기반 Http 클라이언트입니다. 모든 요청은 앱의 기본 UI 스레드 외부에서 이루어 지지만 모든 콜백 논리가 실행됩니다 콜백은 Android Handler 메시지 전달을 사용하여 생성 된 것과 동일한 스레드에서 발생합니다. "

관련 문제