0

HTTP POSTを実行しようとしていますが、時間のかかるタスクを非同期タスクまたはハンドラー内で使用する必要があることがわかったため、ハンドラーを使用してコーディングしようとしましたが、ハンドラーがキャッチされない例外が発生し、場所を特定できません私は間違っています。以下は私のコードとログトレースです。

           @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);


    Button Bt = (Button)findViewById(R.id.button1);
    Button Btx = (Button)findViewById(R.id.button2);




    et = (EditText)findViewById(R.id.editText1);
    etp = (EditText)findViewById(R.id.editText2);

    Bt.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            dialog = ProgressDialog.show(MainActivity.this,"Loading", "Please Wait...");

            h = new Handler(){

                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    dialog.dismiss(); 
                }
            };


            new Thread(){

                @Override
                public void run() {
                    super.run();

                    Connection();

                    try {
                        Thread.sleep(3000);
                        h.sendEmptyMessage(0); 
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }

                }

            }.start();

        }
    });










   // Btx.setOnClickListener(Sig);




}





    private View.OnClickListener Sig =new View.OnClickListener() {
        public void onClick(View v){


            Intent Sign = new Intent(MainActivity.this,Signup.class);
            startActivity(Sign);

        }
        };









    public  void Connection(){
    String is = null;
    String X = et.getText().toString();
    String Y = etp.getText().toString();

    if(X.length()>0 && Y.length()>0){
        A = X;
        B = Y; 
        HttpClient httpclient = new DefaultHttpClient();
        HttpPost httppost = new HttpPost("http://animsinc.com/query.php"); 
        try {
           List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2);
           nameValuePairs.add(new BasicNameValuePair("username", X));
           nameValuePairs.add(new BasicNameValuePair("password",Y));
           httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
           httpclient.execute(httppost);
        //   et.setText(""); // clear text box
        //   etp.setText(""); // clear text box

        HttpResponse responce = httpclient.execute(httppost);
        HttpEntity entity = responce.getEntity();
        is = EntityUtils.toString(entity);
       // in = entity.getContent();
      //  Log.e("post responce----->", "" + is);
        Toast.makeText(this,""+is, Toast.LENGTH_LONG).show();

         } catch (ClientProtocolException e) {
             // TODO Auto-generated catch block
         }catch (UnsupportedEncodingException e) {
            e.printStackTrace();
         }catch (IOException e) {
             // TODO Auto-generated catch block
         }




    } else{
            // display message if text fields are empty
             Toast.makeText(getBaseContext(),"All field are required",Toast.LENGTH_SHORT).show();
         }
    if(is != null){
        Toast.makeText(this,""+is, Toast.LENGTH_LONG).show();

    }



}

}

これは私のログキャットです:

ここに画像の説明を入力してください

4

1 に答える 1

2

問題はあなたが呼んでいるということです:

Toast.makeText(this,""+is, Toast.LENGTH_LONG).show();

run()メソッド内のワーカースレッドから。あなたはそれをすべきではありません。UIで操作できるのは、Main(UI)スレッドからのみです。

解決策は、runOnUiThread()またはAsyncTaskを使用するか、HandlerでToastを表示することです。

于 2013-03-21T10:29:37.930 に答える