0

AsyncTask を使用してプログラムでマルチスレッドを実行していますが、10 秒後に Method を呼び出していますが、代わりにこの Exception があります。

08-04 11:49:29.565: E/log_tag(885): Error converting result java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()

助けてください!!

編集:これは AsyncTask のコードです:

  class Getphonenumber extends AsyncTask<String, Void, Void> {
         public Void doInBackground(String... p) {
          while (true) {
              getPhno();
           try {
            Thread.sleep(10000);
           } catch (InterruptedException ie) {
            ie.printStackTrace();
           }
          }
        }

        };

「getPhno()」メソッド:

public void getPhno()
  {
      try{

            HttpClient httpclient = new DefaultHttpClient();
            HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 10000); //Timeout Limit
            List<NameValuePair> username = new ArrayList<NameValuePair>();
            username.add(new BasicNameValuePair("username", user));
            //Web Address
            HttpPost httppost = new HttpPost("http://www.starretailshop.com/Log/Retrieve.php");
            httppost.setEntity(new UrlEncodedFormEntity(username));
            HttpResponse response = httpclient.execute(httppost);
            ResponseHandler<String> responseHandler = new BasicResponseHandler();
            String responseBody = httpclient.execute(httppost,
                    responseHandler);

            Log.i("retrieve postData", response.getStatusLine().toString());
            InputStream content = response.getEntity().getContent();
            BufferedReader buffer = new BufferedReader(new InputStreamReader(content));
            String s = "";
            while ((s = buffer.readLine()) != null) {

                sendMsg(s,msg);

            }

            }catch(Exception e){

                  Log.e("log_tag", "Error converting result "+e.toString());
            }
  }

「sendMsg」メソッド:

private void sendMsg(String phoneNumber, String message)
    { 
       try{
            String phoneNumber1 = null;

           if(phoneNumber.startsWith("+"))
            {
                phoneNumber1 = phoneNumber.substring(3);

            }
            else if(phoneNumber.startsWith("0"))
            {
                phoneNumber1 = phoneNumber.substring(1);
            }
            else
            {
                phoneNumber1=phoneNumber;
            }
                PendingIntent pi = PendingIntent.getActivity(this, 0,
                    new Intent(), 0);                
                SmsManager sms = SmsManager.getDefault();
                sms.sendTextMessage(phoneNumber1, null, message, pi, null);
                Toast.makeText(this,"Msg sent to:" + phoneNumber1, Toast.LENGTH_LONG).show();
                phnoList.add(phoneNumber);
                phnoListd.add(phoneNumber1);
                //phnumber = phoneNumber;
                //================Update Database=====================

              try{
                  HttpClient httpclient = new DefaultHttpClient();
                  HttpConnectionParams.setConnectionTimeout(httpclient.getParams(), 10000); //Timeout Limit
                  List<NameValuePair> updatemsg = new ArrayList<NameValuePair>();
                  updatemsg.add(new BasicNameValuePair("outmsg1", message));
                  Calendar cal = Calendar.getInstance();
                  SimpleDateFormat sdf = new SimpleDateFormat("HH:m:ss dd-MM-yyyy");
                  String TimeStampDB = sdf.format(cal.getTime()); 
                  updatemsg.add(new BasicNameValuePair("currentdatetime1",TimeStampDB));
                  updatemsg.add(new BasicNameValuePair("mobileno",phoneNumber));

                    //Web Address
                    HttpPost httppost = new HttpPost("http://www.starretailshop.com/Log/Update1.php");
                    httppost.setEntity(new UrlEncodedFormEntity(updatemsg));
                    HttpResponse response = httpclient.execute(httppost);
                    ResponseHandler<String> responseHandler = new BasicResponseHandler();
                    String responseBody = httpclient.execute(httppost,
                            responseHandler);
                    Log.i("update1 postData", response.getStatusLine().toString());
                    }catch(Exception e){
                        Log.e("log_tag", "Error converting result "+e.toString());
                    }

                    //================================================
          }catch(Exception e)
          {
              e.printStackTrace();
              Toast.makeText(this,"Error occured", Toast.LENGTH_LONG).show();
          }


}

Finally I am calling new Getphonenumber().execute(); in an onClickListener of a Button.

4

3 に答える 3

3

私が問題だと思うのは、バックグラウンド スレッドから UI コンポーネントを更新しようとしているということです。

たとえば、AsyncTask でこのメソッドを考えてみましょう。

protected Void doInBackground(String ... x) {
      while (true) {
       System.out.println(x[0]);
       try {
        Thread.sleep(1000);
       } catch (InterruptedException ie) {
        ie.printStackTrace();
       }
      }

このメソッドは、バックグラウンド スレッドに相当します。Andorid では、メインの UI スレッドからのみ UI を更新できます。他のメソッドから更新しようとすると、この例外が発生します。

したがって、これを避けるようにしてください。UI を更新する場合は、AsyncTask の onPostExecute() を使用します。

編集1

ここにあなたの問題があります。sendMsg メソッドからトーストを削除すると、正常に動作するはずです。

于 2012-08-04T06:41:25.403 に答える
2

非 Ui Thread.like から UI を更新するためにrunOnUiThreadをコードとして使用します。バックグラウンド スレッドからのトースト メッセージを表示しているので、トースト メッセージを次のように runOnUiThread 内に配置します。

Current_Activity.this.runOnUiThread(new Runnable() {
  public void run() {

  Toast.makeText(this,"Msg sent to:" + phoneNumber1, Toast.LENGTH_LONG).show();
  }
});
于 2012-08-04T07:03:17.173 に答える
1

doBackround 内でスリープ スレッドを作成する代わりに、.execute() の前に実行してください。それが役立つと思います。

于 2012-08-04T06:50:36.220 に答える