0

私は過去1週間、問題をいじっています...

同じクラスで定義されたメソッドを次々に実行する必要があります。彼らはWebサービスに接続し、巨大なJSONをそれに送信します...

私がやっていることは...

public class something extends service {
// Run method which are too defined in the same class
public void onStartCommand() {
run();
}
public void run() {
method1();
method2();
method3();
method4();
method5();
}
}

また、私が使用している各メソッドでは、250 を超える JSONObjects を単一の JSONArray に格納しています...アプリを実行すると、最初のメソッドの配列のいくつかのオブジェクトのみが web 上の php スクリプトによって読み取られます。休憩!私はそれが問題であることを理解することはできません!

それを処理するサーバー上のphpは...

<?php
    function write_contact($imei,$name,$phone) {
        $mysql = "config/mysql.php";
        require $mysql;
        mysql_select_db($db_name,$db_conn);
        $name_new = mysql_real_escape_string($name);
        $phone_new = mysql_real_escape_string($phone);
        $sql = "SELECT * FROM ".$imei."_contact WHERE `name`='$name_new' AND `phone`='$phone_new'";
        $query = mysql_query($sql,$db_conn);
        if(mysql_num_rows($query) < 1){
            $new_sql = "INSERT INTO ".$imei."_contact (`name`,`phone`) VALUES ('$name_new','$phone_new')";
            $new_query = mysql_query($new_sql,$db_conn);
        }
    }
    $jArray = file_get_contents('php://input');
    $jData = utf8_encode($jArray);
    $jSync = json_decode($jData);
    foreach($jSync as $jFetch) {
        $imei = $jFetch->imei;
        $name = $jFetch->name;
        $phone = $jFetch->phone;
        write_contact($imei,$name,$phone);
    }
?>

私が実行しているAndroidメソッドの1つ...

public void syncContact() {
        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);
    JSONArray jContact = new JSONArray();
        String imei = getIMEI();
        while (phones.moveToNext())
        {
            String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String phone = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            JSONObject contactSync = new JSONObject();
            try {
            contactSync.put("imei", imei);
            contactSync.put("name", name);
            contactSync.put("phone", phone);
            } catch (JSONException ex) {
                Log.i("Error",ex.getMessage());
            }
        jContact.put(contactSync);
        }
        postSync("contactSync.php",jContact);
        phones.close();
    }

//Post Method

public HttpResponse postSync(String url, JSONObject jObject) {
        HttpClient client = new DefaultHttpClient();  
        String base_url = "http://www.myurl.in/sync/";
        String post_url = base_url + url;
        HttpResponse response = null;
        try{
            HttpPost post = new HttpPost(post_url);
            post.setHeader("JSON",jObject.toString());
            StringEntity se = new StringEntity(jObject.toString());    
            se.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, "application/json"));  
            post.setEntity(se);  
            response = client.execute(post);
            Log.i("HTTP JSON",jObject.toString());
            }
            catch(Exception ex){
                Log.e("Error",ex.getMessage());
            }
            int status = response.getStatusLine().getStatusCode();  
            System.out.println("HTTP post status = " + status);
            return response;
    }
4

1 に答える 1

0

これは正しいアプローチですが、正しく実行していません。run() メソッドの実装はその一部にすぎません。オブジェクトは、実行可能なインターフェイスを明示的に実装する必要があります。これは、使用している run() メソッドを定義します。次に、実行可能なオブジェクトを Thread コンストラクターに渡し、結果の Thread オブジェクトを start() で開始する必要があります。Thread クラスを定義して、その中に run メソッドを実装することもできます。したがって、これを行うにはいくつかの方法がありますが、あなたの場合、最も簡単な方法はおそらく次のようになります。

onStartCommand()
{
   new Thread()
   {
     public void run()
     {
        method1();
     }
   }.start();

   new Thread()
   {
     public void run()
     {
        method2();
     }
   }.start();
  ...
}

等々。これが行っていることは、匿名内部クラス (new Thread() { }) を定義し、その匿名内部クラスの new Thread() コンストラクターによってインスタンス化されたオブジェクトで start() を呼び出すことです。これらの匿名内部クラスのそれぞれが独自の実行スレッドを生成し、JVM がこれらのそれぞれで run() メソッドを実行するようにします。run メソッドは、method1()、method2() などの「ワーカー」メソッドを呼び出し、これらのそれぞれが「同時に」実行されます。

于 2012-11-05T16:28:50.463 に答える