0

私はこのコードを使用しています:

  public void run() {
        handler.post(new Runnable() {
            public void run() {       
                try {
                    if (count==true)
                    {        
                        try 
                        {
                            r.stop();
                        } catch (Exception e) {}
                        tranca=false;
                        count=false; 

                        dlg.dismiss();
                        dlg.cancel();
                        dlg.dismiss();

                        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
                            new AsyncCaller().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR );
                             //task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, params);
                        } else {
                            new AsyncCaller().execute();
                        }
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                }
            }
        });
    }
}, 15000);

問題は、 新しい AsyncCaller().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR );を作成する方法がわからないことです。

仕事。問題は、ハニカムの後に asynctask が動作する方法を変更したことです。このコードを見つけました。Honeycomb 以下の Android バージョンでは正常に動作しますが、私のジェリービーンでは動作しません。おそらくnew AsyncCaller().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR );を使用しています。 間違った方法で。非同期タスクは次のとおりです。

private class AsyncCaller extends AsyncTask<Void, Void, Void>
{
    public JSONObject getLocationInfo() {

        HttpGet httpGet = new HttpGet("http://maps.google.com/maps/api/geocode/json?latlng="+latitude1+","+longitude2+"&sensor=true");
        HttpClient client = new DefaultHttpClient();
        HttpResponse response;
        StringBuilder stringBuilder = new StringBuilder();

        try {
            response = client.execute(httpGet);
            HttpEntity entity = response.getEntity();
            InputStream stream = entity.getContent();
            int b;
            while ((b = stream.read()) != -1) {
                stringBuilder.append((char) b);
            }
        } catch (ClientProtocolException e) {
            } catch (IOException e) {
        }

        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject = new JSONObject(stringBuilder.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return jsonObject;
    }

    ProgressDialog pdLoading = new ProgressDialog(MainActivity.this);

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        //this method will be running on UI thread
        pdLoading.setMessage("\tLoading...");
        pdLoading.show();
    }
    @Override
    protected Void doInBackground(Void... params) {

        //this method will be running on background thread so don't update UI frome here
        //do your long running http tasks here,you dont want to pass argument and u can access the parent class' variable url over here


        JSONObject ret = getLocationInfo(); 
        JSONObject location2;
        String location_string;
        try {
            location2 = ret.getJSONArray("results").getJSONObject(0);
            location_string = location2.getString("formatted_address");
            Log.d("test", "formattted address:" + location_string);
            StringRua = (" " + location_string);
        } catch (JSONException e1) {
            e1.printStackTrace();

        }

         StringSMS = (" Latitude " + StringLat + " Longitude " + StringLon + " Ad " + StringRua);   




        EditText Search01; 
        String String01;

        Search01 = (EditText) findViewById(R.id.Search01);
        String01 = Search01.getText().toString();  


        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(String01, null, StringSMS , null, null);

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);

        //this method will be running on UI thread

        pdLoading.dismiss();
    }

    }   

これとまったく同じ質問がstackoverflowにあることは知っていますが、多くの解決策を試しましたが、誰もうまくいかないようです。JellyBean デバイスに対して適切に asynctask を呼び出す必要があるだけです。new AsyncCaller().execute(); に注意してください。 ハニカムの下のデバイスで完全に機能します。ありがとうございました

EDIT:まだ動作していません.Jelly Beanデバイスのdointhebackground内にあるものを実行しません(Loadingを表示しているので、AsynctTaskに送信していることがわかります)。私はすでに Pre と Post に何をする必要があるかをバックグラウンドの外に出そうとしましたが、「NetworkOnMainThreadException」の問題のためにこれを行うことはできません。新しい Android バージョンでプログラムを強制的に閉じるだけです。

4

2 に答える 2

0

asynctask コードをhttps://stackoverflow.com/a/9509184/2190244にコピーし、別のスレッド プール エグゼキューターで非同期タスクを実行する場合は、execute を呼び出して、HC 前後の両方に使用します。HC 以降の AsyncTasks では、独自のエグゼキューターを指定してそれを execute メソッドに渡さない限り、使用される内部メソッドはシリアル エグゼキューターです。

コードを使用したくない場合でも、HC の前と後の両方で execute を呼び出すことができ、正常に動作するはずです。

于 2013-09-08T19:18:49.750 に答える
0

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)、ここを削除し=ます。BuildVersion が api 11 の場合、それはすでにシリアルで実行されます。

targetSdk を最新のものに変更してみてください。AsyncTask の処理方法 (シリアル/パラレル) は、targetSdk によって異なります。AsyncTask の落とし穴について詳しくは、こちらをご覧ください。

于 2013-09-08T20:01:07.780 に答える