2012-03-05 4 views
0

많은 계산이 필요한 함수가 있으므로 스레드 내에서 함수를 호출하려고합니다. 이것은 내가 그것을 할 방법은 다음과 같습니다스레드 및 progressDialog android

submit.setOnClickListener(new OnClickListener() { 

     public void onClick(View view) { 
      if(!(fromAdress.getText().toString().length() > 0) || !(toAdress.getText().toString().length() > 0)) { 
       Toast.makeText(this, "ERROR IN INPUT", Toast.LENGTH_LONG).show();  
      } 
      else { 
       if(connected) { 

        final ProgressDialog dialog = ProgressDialog.show(this, "Calculating", 
          "Please wait...", true); 
          final Handler handler = new Handler() { 
           public void handleMessage(Message msg) { 
            dialog.dismiss(); 
            } 
           }; 
          Thread checkUpdate = new Thread() { 
           public void run() { 

            measureDistanceAndTime(fromAdress.getText().toString(), toAdress.getText().toString()); 

            handler.sendEmptyMessage(0); 
            } 
           }; 
          checkUpdate.start(); 
       } 

       else 
        Toast.makeText(this, "No network!", Toast.LENGTH_LONG).show(); 
      } 

내가 응용 프로그램을 열 때, 그것은해서 ProgressDialog를 보여 주지만, 사초 등의 후,이 응답하지 않습니다. 나는 스레드와 progressdialog에 대한 코드를 제거 할 때이 문제를 해결할 수 없다.

이 방법이 아닙니까?

+0

오류가 있습니까? "응답하지 않는 메시지"가 표시됩니까? 당신이 그것을 내버려두면 그것은 돌아 오지 않습니까? –

답변

3

특정 상황이 작동하지 않는 이유를 정확히 모르겠지만 원시 스레드를 수행하는 대신 AsyncTask을 사용하면 더 나은 행운을 누릴 수 있습니다. 그것은 문제를 일으킬 수있는 UI의 대부분 대 다른 스레드 낯선를 처리합니다. 개념 모델은 당신이 거기에있는 것과 크게 다르지 않으므로 쉽게 변경 될 수 있습니다.

0

UI 스레드에서 수행하고 있기 때문입니다. 따라서 어떤 메시지 동작이 5 초 이상 지속되면 악명 높은 메시지가 표시됩니다 (응답하지 않음).

다른 스레드에는 long-work를 넣어야합니다. 귀하의 경우 UI Thread와 상호 작용하기 때문에 가장 이익이되는 방법은 Asyntask를 사용하는 것입니다.