2013-09-08 2 views
0

Я использую этот код:.Невозможно сделать AsyncTask работы для различных версий андроид

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 изменила способ работы после сотов, и я нашел этот код. Он отлично работает для версий Android ниже Honeycomb, но в моем желе не работает. Я, вероятно, использую новый AsyncCaller(). ExecuteOnExecutor (AsyncTask.THREAD_POOL_EXECUTOR); неправильным способом. AsyncTask это:

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, но я пробовал много решения, и никто не похоже на работу для меня. Мне просто нужно использовать asynctask для устройства JellyBean. Имейте в виду, что новый AsyncCaller(). Execute(); отлично работает в устройствах под сотовыми устройствами. Thank you

EDIT: все еще не работает, он не выполняет то, что находится внутри dointhebackground в устройстве Jelly Bean (он показывает загрузку, поэтому я знаю его отправку в AsynctTask). Я уже пытался поставить вне dothebackground, что нужно сделать, чтобы положить в Pre и Post, но я не могу сделать это из-за проблемы «NetworkOnMainThreadException», которые просто заставляют закрыть программу для новых версий Android.

+0

какой у вас minSdk и targetSdk? – dumazy

+0

android: minSdkVersion = "8" android: targetSdkVersion = "11" – user2757741

+0

проверить мой ответ ниже – dumazy

ответ

0

Скопируйте здесь асинхронный код https://stackoverflow.com/a/9509184/2190244 и используйте его как для предварительной, так и для пост HC, вызывая выполнение, если вы хотите выполнить задачи async в другом исполнителе пула потоков. Для AsyncTasks в HC и выше используемый внутренний метод является последовательным исполнителем, если вы не указали свой собственный исполнитель и не передали его методу execute.

Если вы не хотите использовать этот код, вы все равно можете позвонить выполнить как для предварительной и пост HC и он должен работать нормально

0

в if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB), удалить = здесь. Если вы BuildVersion - это api 11, то это будет работать уже серийно.

Попробуйте изменить целевое значениеSdk на самое новое. Способ обработки AsyncTask (последовательный/параллельный) зависит от targetSdk. Узнайте больше о подводных камнях AsyncTask here

+0

По-видимому, это сработало с моим устройством ICS (это тоже не работало). Телефон с желеобразным телефоном был моим телефоном для друзей, он здесь не совсем прав, но позже он проверит его, и я поставлю здесь результаты, и если работал, я принимал это как ответ. Спасибо – user2757741

+0

Нет. Не работает, он тестировал его, и он загружает, но не выполняет то, что находится внутри dointhebackground.Я уже попытался сделать вне дела, что нужно сделать, но я не могу это сделать из-за проблемы «NetworkOnMainThreadException», которые просто заставляют закрыть программу для новых версий Android. – user2757741

+0

Да, конечно, вы никогда не сможете запустить сетевой код в основном потоке. Начиная с одной из более поздних версий, она выдает ошибку, чтобы разработчики не делали этого. Вы должны убедиться, что все сетевые коды выполняются в другом потоке (doInBackground или просто новый поток) – dumazy