2012-02-15 5 views
0

こんにちは、私はアンドロイドで新しく、ボタンをクリックして2つのWebサービスを開始する必要があります。 最初に1つのサービスを呼び出す必要があり、そのサービスの応答に依存する必要があります。 2番目のサービスを定期的に呼び出す必要があるため、スレッドを使用して2番目のサービスを開始する必要があります。以下 は私のstartWorkボタン(のstartWorkのクリックで呼び出さchangeworkstatus機能)をクリックしたときに私は、実行時例外を以下しまっクリックコード他のスレッドからスレッドを作成すると例外が発生しますLooper.prepare()を呼び出さなかったスレッド内でハンドラを作成できません

import java.io.IOException; 
import org.apache.http.client.ClientProtocolException; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.app.ProgressDialog; 
import android.content.Context; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.os.SystemClock; 
import android.preference.PreferenceManager; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

public class startWork extends Activity implements LocationListener { 
    private LocationManager locationManager; 
    private MyProgressDialog progressDialog; 
    private String provider; 
    private static ProgressDialog progDailog; 
    public static String latitude = "0"; 
    public static String longitude = "0"; 
    public static String userid = ""; 
    public static String password = ""; 
    public static String activationid = ""; 
    public static long locationSendingPeriod = 1000; 
    public static String role = "Driver"; 
    public static int j = 0; 
    public static int i = 0; 
    static final String ACTION = "com.google.android.c2dm.intent.RECEIVE"; 
    private Handler mHandler = new Handler(); 
    private Runnable mUpdateTimeTask = new Runnable() { 
     public void run() { 

      long millis = SystemClock.uptimeMillis(); 
      int seconds = (int) (millis/1000); 
      int minutes = seconds/60; 
      seconds = seconds % 60; 

      // put your code below to run every second 
      try { 

       // latitude = "31.794483"; 
       // longitude = "34.641747"; 

       String DriverUpdateXml = soapXml.getDriverUpdateLocation(
         startWork.userid, startWork.password, 
         startWork.activationid, startWork.role, latitude, 
         longitude); 

       Soap.getSoapResponse(DriverUpdateXml); 

      } catch (Exception e) { 
       // TODO Auto-generated catch block 

      } 
      // end put your code below to run every second 
      mHandler.postAtTime(this, startWork.locationSendingPeriod 
        + (((minutes * 60) + seconds + 1) * 1000)); 

     } 
    }; 

**// this is my method which is call onclick of button** 

    public void changeWorkStatus(View view) throws ClientProtocolException, 
      IOException { 
     progressDialog = new MyProgressDialog(this); 

     new Thread(new Runnable() { 
      public void run() { 

       try { 
        // progressHandler.postDelayed(progressUpdate, 100); 
        // progDailog = ProgressDialog.show(this, "", ""); 

        SharedPreferences prefs = PreferenceManager 
          .getDefaultSharedPreferences(startWork.this); 
        Button btnWork = (Button) findViewById(R.id.buttonStartWork); 
        String workText = btnWork.getText().toString(); 
        String start_work = getResources().getString(
          R.string.start_work); 
        String finish_work = getResources().getString(
          R.string.finish_work); 

        String userid = prefs.getString(CreateDriver.PREFS_UserId, 
          ""); 
        String password = prefs.getString(
          CreateDriver.PREFS_Password, ""); 
        String activationid = prefs.getString(
          CreateDriver.PREFS_ActivationId, ""); 
        String role = "Driver"; 
        if (workText.equals(start_work)) { 
         // LocationManager mlocManager = (LocationManager) 
         // getSystemService(Context.LOCATION_SERVICE); 
         // LocationListener mlocListener = new 
         // taxiLocationListener(); 
         // mlocManager.requestLocationUpdates(
         // LocationManager.GPS_PROVIDER, 1000, (float) 0.01, 
         // mlocListener); 

         // String latitude = "31.794483"; 
         // String longitude = "34.641747"; 

         String DriverChangeStatus = soapXml.getDriverLogIn(
           userid, password, activationid, role, 
           latitude.toString(), longitude.toString()); 

         String resp = Soap.getSoapResponse(DriverChangeStatus); 

         org.w3c.dom.Document doc = XMLfunctions 
           .XMLfromString(resp); 

         NodeList nodes = doc.getElementsByTagName("Status"); 
         Element elem = (Element) nodes.item(0); 
         String opt = XMLfunctions.getValue(elem, "Status"); 

         nodes = doc 
           .getElementsByTagName("LocationSendingPeriod"); 
         elem = (Element) nodes.item(0); 
         locationSendingPeriod = Long.valueOf(XMLfunctions 
           .getValue(elem, "LocationSendingPeriod")) * 1000; 

         if (opt.equals("Success")) { 
          String status = "Available"; 
          String DriverAvailable = soapXml 
            .getDriverChangeStatus(userid, password, 
              activationid, role, status); 
          Soap.getSoapResponse(DriverAvailable); 

          btnWork.setText(finish_work); 
          btnWork.setBackgroundResource(R.drawable.btn_end); 

          mHandler.removeCallbacks(mUpdateTimeTask); 
          mHandler.post(mUpdateTimeTask); 

         } 
        } else { 
         mHandler.removeCallbacks(mUpdateTimeTask); 

         String DriverChangeStatus = soapXml.getDriverLogOut(
           userid, password, activationid, role); 

         String resp = Soap.getSoapResponse(DriverChangeStatus); 

         org.w3c.dom.Document doc = XMLfunctions 
           .XMLfromString(resp); 

         NodeList nodes = doc.getElementsByTagName("Status"); 
         Element elem = (Element) nodes.item(0); 
         String opt = XMLfunctions.getValue(elem, "Status"); 

         if (opt.equals("Success")) { 
          btnWork.setText(start_work); 
          btnWork.setBackgroundResource(R.drawable.btn_more_yellow); 
         } 
        } 

        // progressHandler.removeCallbacks(progressUpdate); 

       } catch (Exception e) { 

        new AlertDialog.Builder(startWork.this) 
          .setMessage(e.toString()) 
          .setNeutralButton("OK", null).show(); 
       } 

       progressDialog.dismiss(); 
      } 
     }).start(); 

    } 

    public void onLocationChanged(Location location) { 
     latitude = String.valueOf(location.getLatitude()); 
     longitude = String.valueOf(location.getLongitude()); 
    } 

    public void onStatusChanged(String provider, int status, Bundle extras) { 
     // TODO Auto-generated method stub 

    } 

    public void onProviderEnabled(String provider) { 

    } 

    public void onProviderDisabled(String provider) { 
     Toast.makeText(this, "Disabled provider " + provider, 
       Toast.LENGTH_SHORT).show(); 
    } 

} 

に私です。

Looper.prepare()を呼び出していないスレッド内でハンドラを作成できません 私の質問は上記のエラーを解決する方法ですか?

+0

私の質問が更新されます。私を助けてください。 –

答えて

0

多くのことを他のスレッドでやっているし、イベントスレッド、トーストの表示、ダイアログの解除など、イベントスレッド内のコードをハンドラまたはAsynctaskを使ってイベントスレッドに配置してください。

+0

あなたの答えをありがとう。 私は非同期タスクを使用して私の問題を解決します。 –

関連する問題