2013-01-17 3 views
2

의사 랜덤 문자열을 서버 데이터베이스로 보내는 간단한 응용 프로그램을 개발 중입니다. 여기 전선에서 서버 및 ProgressDialog 문자열을 보내는 AsyncTask 사용하고 있습니다. 문제는 진행 대화 상자가 멈추지 않고 서버에서 어떤 문자열도 찾지 못한다는 것입니다. srcetring을 보내는 코드에 문제가있을 수 있습니다. 나는 안드로이드에 익숙하지 않고 인터넷에서 구할 수있는 자료를 통해 배울 수 있습니다. 다음은 내가 사용하는 코드입니다.ProgressDialog가 AsyncTask로 중지하지 않습니다.

public class MainActivity extends Activity { 

    Button btn; 
    TextView tv; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tv = (TextView)findViewById(R.id.textView2); 
     btn = (Button)findViewById(R.id.button1); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.activity_main, menu); 
     return true; 
    } 

    public void getThis(View v) { 
     String str = "35" + 
      Build.BOARD.length()%10+ Build.BRAND.length()%10 + 
      Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + 
      Build.DISPLAY.length()%10 + Build.HOST.length()%10 + 
      Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + 
      Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + 
      Build.TAGS.length()%10 + Build.TYPE.length()%10 + 
      Build.USER.length()%10 ; 
     tv.setText(str); 
     UploadUniqueID uni=new UploadUniqueID(this,str); 
     uni.execute(str); 
    } 

    class UploadUniqueID extends AsyncTask<String, Integer, String> { 

     Context context; 
     MainActivity ma; 
     ProgressDialog dialog; 
     String id; 
     public UploadUniqueID(MainActivity activity,String str) { 
      ma = activity; 
      context = activity; 
      dialog = new ProgressDialog(context); 
      id = str; 
     } 

     protected void onPreExecute() { 
      this.dialog.setMessage("Progress start"); 
      this.dialog.setCancelable(true); 
      this.dialog.show(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      // perform long running operation operation 
      String id=params[0]; 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost("http://10.0.2.2/UniqueIdApp/myPHP.php"); 

      try { 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
       nameValuePairs.add(new BasicNameValuePair("android",id));  
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       httpclient.execute(httppost);   
      } catch (Exception e) { 
       Log.i("HTTP Failed", e.toString()); 
      }    

      return null; 
     } 

     protected void onProgressUpdate(Integer...integers) { 

     } 

     protected void onPostExecute(String...strings) { 
      tv.setText("Sent"); 
      if (dialog.isShowing()) { 
       dialog.dismiss(); 
      } 
     } 
    } 
} 
+0

.. –

+0

가 아니 .. 내가 어떤 오류가 발생하지 오전 로그 캣 포스트에 어떤 오류가 발생하는 경우 – apatel

답변

0

또한 만들고 수행하여 UploadUniqueID AsyncTask를 클래스에 대화 상자를 초기화 할 수 있습니다 :

private final ProgressDialog dialog = new ProgressDialog(MainActivity.this); 

를 그냥 당신이로 onPostExecute(...) 방법에 해고 현재하고 있습니다. 또한 onPreExecute() 메소드에 @Override 주석을 추가하십시오.

+0

안녕하세요. 프로세스를 완료하는 데 1 분. 그 이유는 무엇일까요? – apatel

+0

@aakash 웹 관련 작업을 수행하므로 웹 서비스를 통해 가져 오는 데이터 양에 따라 시간이 달라집니다. 그러나, 그것은 정상이며, 당신이 할 수있는 일은 PHP 쪽에서 코드를 최적화하고 속도를 높이는 것입니다. –

+0

고릴라 형제 .. 그것은 많은 도움이되었습니다. – apatel

0

난 당신이 protected void onCreate(Bundle savedInstanceState) 방법에 ProgressDialog dialog 객체를 초기화하는 것이 좋습니다 것이며, onPostExecute(String...strings) 방법으로 진행 막대를 닫습니다. 이것은 당신이 환호하는 데 도움이 될 수 있습니다 :).

편집

public class MainActivity extends Activity { 
ProgressDialog dialog; 
Button btn; 
TextView tv; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    tv = (TextView)findViewById(R.id.textView2); 
    btn = (Button)findViewById(R.id.button1); 
    dialog = new ProgressDialog(MainActivity.this); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.activity_main, menu); 
    return true; 
} 

public void getThis(View v) { 
    String str = "35" + 
     Build.BOARD.length()%10+ Build.BRAND.length()%10 + 
     Build.CPU_ABI.length()%10 + Build.DEVICE.length()%10 + 
     Build.DISPLAY.length()%10 + Build.HOST.length()%10 + 
     Build.ID.length()%10 + Build.MANUFACTURER.length()%10 + 
     Build.MODEL.length()%10 + Build.PRODUCT.length()%10 + 
     Build.TAGS.length()%10 + Build.TYPE.length()%10 + 
     Build.USER.length()%10 ; 
    tv.setText(str); 
    UploadUniqueID uni=new UploadUniqueID(this,str); 
    uni.execute(str); 
} 

class UploadUniqueID extends AsyncTask<String, Integer, String> { 

    Context context; 
    MainActivity ma; 
    ProgressDialog dialog; 
    String id; 
    /*public UploadUniqueID(MainActivity activity,String str) { 
     ma = activity; 
     context = activity; 
     dialog = new ProgressDialog(context); 
     id = str; 
    }*/ 

    protected void onPreExecute() { 
     dialog.setMessage("Progress start"); 
     dialog.setCancelable(true); 
     dialog.show(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     // perform long running operation operation 
     String id=params[0]; 
     HttpClient httpclient = new DefaultHttpClient(); 
     HttpPost httppost = new HttpPost("http://10.0.2.2/UniqueIdApp/myPHP.php"); 

     try { 
      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(1); 
      nameValuePairs.add(new BasicNameValuePair("android",id));  
      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      httpclient.execute(httppost);   
     } catch (Exception e) { 
      Log.i("HTTP Failed", e.toString()); 
     }    

     return null; 
    } 

    protected void onProgressUpdate(Integer...integers) { 

    } 

    protected void onPostExecute(String...strings) { 
     tv.setText("Sent"); 
     try{ 
    if(dialog!=null && dialog.isShowing()){ 
     dialog.setMessage("DownLoading finished"); 
     dialog.dismiss(); 
    } 
    }catch(Exception e){ 
     e.printStackTrace(); 
    } 
    } 
    } 
} 
+0

나는 그것을 시도 ...하지만이 무엇 – apatel

+0

작동하지 않음 당신은 시도 ??? 시도한 코드 스 니펫을 표시 할 수 있습니까? – BBdev

+0

코드를 편집했는데 현재 작동하는지 확인하지 않습니까? – BBdev

0

아래 코드를 사용해보십시오 :

public class MainActivity extends Activity { 
    Button btn; 
    TextView tv; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     tv = (TextView) findViewById(R.id.textView1); 
     btn = (Button) findViewById(R.id.button1); 
    } 

    public void getThis(View v) { 
     String str = "35" + Build.BOARD.length() % 10 + Build.BRAND.length() 
      % 10 + Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 
      + Build.DISPLAY.length() % 10 + Build.HOST.length() % 10 
      + Build.ID.length() % 10 + Build.MANUFACTURER.length() % 10 
      + Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10 
      + Build.TAGS.length() % 10 + Build.TYPE.length() % 10 
      + Build.USER.length() % 10; 
     tv.setText(str); 
     UploadUniqueID uni = new UploadUniqueID(this, str); 
     uni.execute(str); 
    } 

    class UploadUniqueID extends AsyncTask<String, Integer, String> { 
     Context context; 
     MainActivity ma; 
     ProgressDialog dialog; 
     String id; 

     public UploadUniqueID(MainActivity activity, String str) { 
      ma = activity; 
      context = activity; 
      dialog = new ProgressDialog(activity); 
      id = str; 
     } 

     protected void onPreExecute() { 
      dialog.setMessage("Progress start"); 
      dialog.setCancelable(true); 
      dialog.show(); 
     } 

     @Override 
     protected String doInBackground(String... params) { 
      // perform long running operation operation 
      String id = params[0]; 
      HttpClient httpclient = new DefaultHttpClient(); 
      HttpPost httppost = new HttpPost(
       "http://10.0.2.2/UniqueIdApp/myPHP.php"); 
      try { 
       List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(
        1); 
       nameValuePairs.add(new BasicNameValuePair("android", id)); 
       httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
       httpclient.execute(httppost); 
      } catch (Exception e) { 
       Log.i("HTTP Failed", e.toString()); 
      } 

      return null; 
     } 

     protected void onProgressUpdate(Integer... integers) { } 

     protected void onPostExecute(String p_result) { 
      super.onPostExecute(p_result);   
      tv.setText("Sent"); 
      if (dialog.isShowing()) { 
       dialog.dismiss(); 
      } 
     } 
    } 
} 
여기
+0

친애하는 그건 단지 주석이며 이것은 우리가 메소드를 오버라이드하고 싶을 때 우리는이 주석을 사용하여 컴파일러에게 기존 메소드를 오버라이드한다고 말할 수 있습니다. 컴파일러가 슈퍼 클래스에서 일치하는 메소드를 찾지 못하면 경고를 생성합니다. 메소드를 재정의 할 때 @Override를 사용하는 것은 필수 사항이 아닙니다. 필수는 아니지만 최선의 방법으로 간주됩니다. – BBdev

+0

@BBdev - 예, 필수 사항은 아니지만 진행률 대화 상자를 닫으려면 호출해야합니다. 그렇지 않으면 컴파일러는 그것을 감지하지 못하고'dialog.dismiss();'를 호출하지 않을 것이다. 이 문제점을 발견 한 이유는'onPostExecute'가이 솔루션을 제안한 이유를 찾지 못했기 때문입니다. – GrIsHu

+1

이 있나요 ??? 'oncreate' 메소드에서 @Override를 제거하고 내 앱을 실행하면 내 앱이 시작되지 않을까? 한번 시도해보십시오. 내가 아는대로 앱을 실행합니다. – BBdev

관련 문제