2

Android Javaコードでキューを処理する方法を知る必要があります。キューが空でないときにメソッドを起動したい。これについて誰かアドバイスをいただけませんか…</p>

現在、タイマータスクを実装しています。このクラスは、キューのステータスを頻繁に確認します。キューが空でない場合、メソッドが起動されます。

これを行う別の方法があることを知りたい..

public class GSMLocationTask extends TimerTask { Handler TDGetDeviceLocHandler;

int myLatitude, myLongitude;
int cid;
int lac;
double latitude;
double longitude;
TelephonyManager telephonyManager;
GsmCellLocation cellLocation;
LocationSendTask lst;

public GSMLocationTask(LocationSendTask locSendtask) {
    // TODO Auto-generated constructor stub
    this.lst = locSendtask;
    this.telephonyManager = (TelephonyManager)TrackDriodApplication.getAppContext().getSystemService(TrackDriodApplication.getAppContext().TELEPHONY_SERVICE);
    this.cellLocation = (GsmCellLocation) telephonyManager.getCellLocation();
}


@Override
public void run() 
{
    Log.d("GSMLocationTask", "GSM Location task Start run...");

       //cid = cellLocation.getCid();
       //lac = cellLocation.getLac();
       cid = 256229;//cellLocation.getCid();
       lac = 30310;//cellLocation.getLac();
       try 
       {
           //new TDGetDeviceLocation().execute(null, null, null); 

           if(RqsLocation(cid, lac))
            {
                latitude = (float)myLatitude/1000000;
                longitude = (float)myLongitude/1000000;
                Log.d("GSMLocationTask", "Lat :" +latitude +" Long :"+longitude);
            }

           DataTransaction dtra = new DataTransaction();
           ServerSettings ss = new ServerSettings();
           ss = dtra.getDeviceSettings(TrackDriodApplication.getAppContext());
           String deviceID = String.valueOf(ss.getDeviceID());
           Log.d("GSMLocationTask", "locationSend obj create");
           LocationSend loc = new LocationSend();
           Log.d("GSMLocationTask", "set lat");
           loc.setLatitude(Double.toString(latitude));
           Log.d("GSMLocationTask", "set long");
           loc.setLongitude(Double.toString(longitude));
           Log.d("GSMLocationTask", "set devid");
           loc.setDeviceID(deviceID);
           Log.d("GSMLocationTask", "set set datetime");
           loc.setDateTime(getCurrentTime());

           Log.d("GSMLocationTask", "add loc to queue sart");
           lst.addLocationToQueue(loc);
           Log.d("GSMLocationTask", "add loc to queue end");
       } 
       catch (Exception e)
       {  
       }


}
private static String getCurrentTime()
{
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String currentDateandTime = sdf.format(new Date());
    return currentDateandTime;
}

private Boolean RqsLocation(int cid, int lac)
{          
    Log.d("GSMLocationTask", "call ReqLocation");
           Boolean result = false;
           String urlmmap = "http://www.google.com/glm/mmap";  

              try {
                  Log.d("GSMLocationTask", "start try..");
               URL url = new URL(urlmmap);
               URLConnection conn = url.openConnection();
               HttpURLConnection httpConn = (HttpURLConnection) conn;      
               httpConn.setRequestMethod("POST");
               httpConn.setDoOutput(true);
               httpConn.setDoInput(true);
               httpConn.connect();

               OutputStream outputStream = httpConn.getOutputStream();
               WriteData(outputStream, cid, lac);

               InputStream inputStream = httpConn.getInputStream();
               DataInputStream dataInputStream = new DataInputStream(inputStream);

               dataInputStream.readShort();
               dataInputStream.readByte();
               int code = dataInputStream.readInt();
               if (code == 0) 
               {
                   myLatitude = dataInputStream.readInt();
                   myLongitude = dataInputStream.readInt();

                   result = true;   
               }
               Log.d("GSMLocationTask", "end try..");

         } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
         }
         Log.d("GSMLocationTask", "return result :" +result);
         return result;

 }

 private void WriteData(OutputStream out, int cid, int lac) throws IOException        
    {    
        DataOutputStream dataOutputStream = new DataOutputStream(out);
        dataOutputStream.writeShort(21);
        dataOutputStream.writeLong(0);
        dataOutputStream.writeUTF("en");
        dataOutputStream.writeUTF("Android");
        dataOutputStream.writeUTF("1.0");
        dataOutputStream.writeUTF("Web");
        dataOutputStream.writeByte(27);
        dataOutputStream.writeInt(0);
        dataOutputStream.writeInt(0);
        dataOutputStream.writeInt(3);
        dataOutputStream.writeUTF("");           
        dataOutputStream.writeInt(cid);
        dataOutputStream.writeInt(lac);              
        dataOutputStream.writeInt(0);
        dataOutputStream.writeInt(0);
        dataOutputStream.writeInt(0);
        dataOutputStream.writeInt(0);
        dataOutputStream.flush();       
    }

class TDGetDeviceLocation extends AsyncTask<Object, Object, Object>{

    @Override
    protected Object doInBackground(Object... params) {
        try 
        {               
            Log.d("GSMLocationTask", "doInBackground start........");
            if(RqsLocation(cid, lac))
            {
                latitude = (float)myLatitude/1000000;
                longitude = (float)myLongitude/1000000;
            }

            return null;
        } 
        catch (Exception e) 
        { 
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }       
} 

}

4

2 に答える 2

2

これは、Queueオブジェクトを使用してキューを作成および管理し、Observerインターフェイスを使用して要素をキューに追加するときにイベントを発生させることで実現できます。

ここに例があります。

于 2013-01-14T11:08:54.627 に答える
0

タイマー スレッドの代わりに、通常のスレッドとブロッキング キューを使用します。

class Worker extends Thread {
  BlockingQueue<LocationSend> queue = new LinkedBlockingQueue<LocationSend>();

  public void run() {
     for (;;) {
        LocationSend loc=queue.take();
        someMethod(loc):
     }
  }
}
...
Worker worker=new Worker();
worker.start();
...
LocationSend loc = new LocationSend();
worker.queue.put(loc);
于 2013-01-14T12:07:10.220 に答える