2012-02-15 49 views
0

嗨,我是新的android和我需要啓動2點擊按鈕上的webservices。 首先需要調用一個服務,並依賴於該服務的響應 需要使用線程啓動第二個服務,因爲我需要定期調用第二個服務。下面 是我上單擊代碼從其他線程創建線程拋出異常像不能創建處理程序線程內沒有調用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(); 
    } 

} 

我得到以下運行時異常時(呼籲startwork的點擊changeworkstatus功能)點擊我的startwork按鈕。

無法創建內螺紋處理程序尚未調用Looper.prepare() 所以我的問題是如何解決上面的錯誤?

+0

我更新我的問題。請幫幫我。 – 2012-02-16 05:37:36

回答

0

您在其他線程中做了很多事情,然後應該是事件線程,如吐司顯示,解散對話框,請使用Handler或Asynctask將您需要在Event線程中的代碼置於事件線程中。

+0

謝謝你的回答。 我通過使用異步任務解決了我的問題。 – 2012-02-17 06:46:59

相關問題