2014-12-07 3 views
1

AsyncTask를 사용하여 성공적으로 내 서블릿 서버에 연결할 수 있지만 진행중인 네트워크 작업이 있음을 사용자에게 알려주는 진행 대화 상자를 갖고 싶습니다. (2G 및 때로는 3G를 사용하여 결과를 가져 오는 데 지연이 발생할 수 있음). 내가 생각하는 (안드로이드에서 asyncTask가없는 네트워크 작업

private class GetQinfo extends AsyncTask<String, Void,String> { 
      ProgressDialog progDailog ; 
      protected void onPreExecute() { 
        super.onPreExecute(); 
        progDailog= new ProgressDialog(GetTicket.this); 
        progDailog.setMessage("pls wait"); 
        progDailog.setIndeterminate(false); 
        progDailog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
        progDailog.setCancelable(true); 
        progDailog.show(); 
       }  
     protected String doInBackground(String... arg0) {...} 
     protected void onPostExecute(String branchQ){ 
     ... 
     progDailog.dismiss(); 
     } 
} 

하지만 내가 정말 필요 없어요 이후이 나에게

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

그래서 내가 AsyncTask를 사용을 중지하기로 결정 예외를 준 : AsyncTask를이 작업을 수행하려고 할 때 추락 내 문제는 시작). 사용자가 UI에서 어떤 작업도 할 수 없으므로 AsyncTask를 사용하는 것이 중요합니까? 나는 스레딩 솔루션에 들어갑니다 :

 new Thread(new Runnable() { 
      public void run() { 
      String line=null; 
      try { 
        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
       nameValuePairs.add(new BasicNameValuePair("command", "GetQ")); 
       nameValuePairs.add(new BasicNameValuePair("city", city)); 
       nameValuePairs.add(new BasicNameValuePair("type", type)); 
       nameValuePairs.add(new BasicNameValuePair("org", org)); 
       nameValuePairs.add(new BasicNameValuePair("branch", spinner.getSelectedItem().toString())); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"utf-8")); 

       // Execute HTTP Post Request 
       HttpResponse response = httpclient.execute(httppost); 
       HttpEntity ht = response.getEntity(); 
       BufferedHttpEntity buf = new BufferedHttpEntity(ht); 
       InputStream is = buf.getContent(); 
       BufferedReader r = new BufferedReader(new InputStreamReader(is)); 

       line = r.readLine(); 
       nameValuePairs.clear(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
       line="-1"; 
      } 

      String[] info=line.split(";"); 
      if(info[1].equals("-1")){ 
       Toast.makeText(getApplicationContext(), "Some msg", Toast.LENGTH_LONG).show(); 
      } 
      else{ 
       .... 
       //Update the UI 
       } 
      } 
      }).start(); 

그러나 어떤 이유로이 java.net.SocketException가 던져 : 소켓 HttpResponse에 응답 = httpclient.execute (httppost)이 라인에 문을 닫습니다; 아이디어가 있습니까? 감사합니다

편집 : @Ahmad Dwaik '흑 마법사' 내가 스피너와 내가 java.lang.RuntimeException가 받기를 실행하여 방법

public void onItemSelected(AdapterView<?> arg0, View arg1, 
      int arg2, long arg3) { 
     if(arg2==0){ 
      //no selection 
      } 
     else{ 
new GetQinfo().execute(city,type,org,spinner.getSelectedItem().toString()); 
} 

가 주 스레드에서 호출 할 : Looper.prepare() 오류를 호출하지 않은 스레드 내부에서 처리기를 만들 수 없습니다. 로그는

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 
12-07 10:16:19.285: E/AndroidRuntime(1929):  at android.os.Handler.<init>(Handler.java:200) 
12-07 10:16:19.285: E/AndroidRuntime(1929):  at android.os.Handler.<init>(Handler.java:114) 
12-07 10:16:19.285: E/AndroidRuntime(1929):  at android.app.Dialog.<init>(Dialog.java:109) 
12-07 10:16:19.285: E/AndroidRuntime(1929):  at android.app.AlertDialog.<init>(AlertDialog.java:114) 
12-07 10:16:19.285: E/AndroidRuntime(1929):  at android.app.AlertDialog.<init>(AlertDialog.java:98) 
12-07 10:16:19.285: E/AndroidRuntime(1929):  at android.app.ProgressDialog.<init>(ProgressDialog.java:77) 
12-07 10:16:19.285: E/AndroidRuntime(1929):  at com.example.quecustomer.GetTicket$GetQinfo.onPreExecute(GetTicket.java:872) 
12-07 10:16:19.285: E/AndroidRuntime(1929):  at android.os.AsyncTask.executeOnExecutor(AsyncTask.java:587) 
12-07 10:16:19.285: E/AndroidRuntime(1929):  at android.os.AsyncTask.execute(AsyncTask.java:535) 
12-07 10:16:19.285: E/AndroidRuntime(1929):  at com.example.quecustomer.GetTicket$1.run(GetTicket.java:781) 
12-07 10:16:19.285: E/AndroidRuntime(1929):  at java.lang.Thread.run(Thread.java:841) 
GetTicket.java:872이 줄을 참조한다

:

progDailog= new ProgressDialog(GetTicket.this); 

내 doInBackground :

Override 
      protected String doInBackground(String... arg0) { 
       try { 
         List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
        nameValuePairs.add(new BasicNameValuePair("command", "GetQ")); 
        nameValuePairs.add(new BasicNameValuePair("city", arg0[0])); 
        nameValuePairs.add(new BasicNameValuePair("type", arg0[1])); 
        nameValuePairs.add(new BasicNameValuePair("org", arg0[2])); 
        nameValuePairs.add(new BasicNameValuePair("branch", arg0[3])); 
        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs,"utf-8")); 
        // Execute HTTP Post Request 
        HttpResponse response = httpclient.execute(httppost); 
        HttpEntity ht = response.getEntity(); 
        BufferedHttpEntity buf = new BufferedHttpEntity(ht); 
        InputStream is = buf.getContent(); 
        BufferedReader r = new BufferedReader(new InputStreamReader(is)); 
        String line = r.readLine(); 
        nameValuePairs.clear(); 
        return line; 
       } catch (IOException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       return null; 
      } 

@ EDIT 2 그것은 내가 방법을 발견 밝혀 반올림하지만 올바른지 확실하지 않습니다. 잘 작동하므로 꼭 그래야합니다 :)

ProgressDialog를 만들고 onPostExecute()에서 닫으려면 onProgressUpdate (Void ... none)를 사용했습니다. 무엇을 만드시겠습니까? 당신은 당신이 "UI"스레드 홈페이지 내에서 AsyncTask를 new GetQinfo().execute(args);를 호출하지 않는 것 같습니다 많은 세부 사항

java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare() 

를 제공하지 않은이 오류에 대한

답변

0

을 보여 경우 스택 추적 당신이 여기 다른 Thread에서 AsyncTask을 요구하고 있음을 보여줍니다 GetTicket의 라인 781에

12-07 10:16:19.285: E/AndroidRuntime(1929):  at com.example.quecustomer.GetTicket$1.run(GetTicket.java:781) 
12-07 10:16:19.285: E/AndroidRuntime(1929):  at java.lang.Thread.run(Thread.java:841) 

봐.이 당신은 아마 new GetQinfo.execute()를 호출하는으로 이동하는이 :

12-07 10:16:19.285: E/AndroidRuntime(1929):  at com.example.quecustomer.GetTicket$GetQinfo.onPreExecute(GetTicket.java:872) 
+0

! 나는이 AsyncTask를 두 곳에서 호출한다. 하나는 스레드이고 다른 하나는 스레드로부터 온 것입니다. 그럼 그게 무슨 뜻 이죠? asynctask를 호출하는 스레드에서 진도 대화 상자를 호출 할 수 없습니까? –

+0

아니요, 할 수 없습니다. UI'Thread'만으로'AsyncTask'를 호출해야합니다. – Emmanuel

0

.

AsyncTask를 다시 사용하여 잘 구현하고 메인 스레드 내에서 직접 호출하는 것이 좋습니다. 그 didnt가 도움이 전체 AsyncTask를 서브 클래스의 전체 로그 캣

+0

볼 편집 질문 –

+0

친절하게 당신의 doInBackground를 게시() 구현 –

+0

편집 주요 포스트 –

관련 문제