2013-11-08 3 views
1

Позвольте мне объяснить мою проблему .. скажем, у меня есть три вкладки: FragmentTab1/FragmentTab2/FragmentTab3.Как остановить выполнение AsyncTask при переключении между вкладками при сохранении предыдущих

Теперь у меня есть listview в FragmentTab1. Здесь я загружаю данные с помощью AsyncTask на OnCreateView().

Данные загружаются отлично. Теперь, когда я перейду к деталям и снова вернусь к списку в FragementTab1. Здесь все данные загружаются, снова теряя ранее загруженные данные.

Теперь мне нужно решение, которое перестает выполнять AsyncTask снова и снова, пока на обратной дорожке сохраняется весь вид и данные, как мы выполняем работу в устаревшей TabHost.

Любая помощь или предложение будут высоко оценены.

Вот мой код.

public class Talk extends Fragment { 
    /** Define global variables over here */ 
    //private ProgressDialog pDialog; 
StaticApiList sal; 
TalkModelAll tma; 
JSONObject myJasonObject = null; 
private ListView lv; 
private ArrayList<TalkModelAll> m_ArrayList = null; 
//ArrayList<String> stringArrayList = new ArrayList<String>(); 
TalkArrayAdapter taa; 
Set<String> uniqueValues = new HashSet<String>(); 
TextView rowTextView = null; 

int postid; 
String title; 
String thumsrc; 
String largeimg; 
String excert; 
String description; 
String cat; 
String myUrl; 
String jsonString; 
int mCurCheckPosition; 
String check_state = null; 
String ccc; 
LinearLayout myLinearLayout; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.talk, container, false); 

    new TalkAsyncTask().execute(); 
    /*if(check_state == null){ 
    new TalkAsyncTask().execute(); 
    }else{ 
     new TalkAsyncTask().execute(); 
     Toast.makeText(getActivity(), "Have no null value for reloading fragment", Toast.LENGTH_LONG).show(); 
    }*/ 


    LinearLayout ll = (LinearLayout) rootView.findViewById(R.id.talk_ll); 
    ll.setBackgroundColor(getActivity().getResources().getColor(R.color.talk_red_bottom)); 

    Log.d("track", "=================> " +uniqueValues.size()); 
    myLinearLayout = (LinearLayout) rootView.findViewById(R.id.talk_ll_uni); 

    return rootView; 
} 

    private class TalkAsyncTask extends AsyncTask<String, Void, String> { 

    @Override 
    protected void onPreExecute() { 
     // TODO Auto-generated method stub 
     super.onPreExecute(); 

     /*pDialog = new ProgressDialog(getActivity()); 
     pDialog.setMessage("Please wait ..."); 
     pDialog.setIndeterminate(false); 
     pDialog.setCancelable(false); 
     pDialog.show();*/ 
    } 

    @Override 
    protected String doInBackground(String... params) { 
     sal = new StaticApiList(); 
     myUrl = StaticApiList.talk_api; 
     HttpClient httpClient = new DefaultHttpClient(); 
     HttpGet httpGet = new HttpGet(myUrl); 

     try { 
      HttpResponse httpResponse = httpClient.execute(httpGet); 
      System.out.println("httpResponse"); 

      InputStream inputStream = httpResponse.getEntity().getContent(); 
      InputStreamReader inputStreamReader = new InputStreamReader(
        inputStream); 
      BufferedReader bufferedReader = new BufferedReader(
        inputStreamReader); 
      StringBuilder stringBuilder = new StringBuilder(); 
      String bufferedStrChunk = null; 
      while ((bufferedStrChunk = bufferedReader.readLine()) != null) { 
       stringBuilder.append(bufferedStrChunk); 
      } 
      jsonString = stringBuilder.toString(); 
      Log.i("talk_all_json", jsonString); 
      return stringBuilder.toString(); 

     } catch (ClientProtocolException cpe) { 
      System.out.println("Exception generates caz of httpResponse :" 
        + cpe); 
      cpe.printStackTrace(); 
     } catch (IOException ioe) { 
      System.out 
        .println("Second exception generates caz of httpResponse :" 
          + ioe); 
      ioe.printStackTrace(); 
     } 

     return null; 
    } 

    @SuppressLint("DefaultLocale") 
    @Override 
    protected void onPostExecute(String result) { 
     // TODO Auto-generated method stub 
     super.onPostExecute(result); 
     check_state = jsonString; 
     try{ 
      m_ArrayList = new ArrayList<TalkModelAll>(); 
      if (jsonString.length() > 0) { 
        JSONArray jArray = new JSONArray(jsonString); 

         for(int i=0; i < jArray.length(); i++) { 

          JSONObject jObject = jArray.getJSONObject(i); 

          title = jObject.getString("title"); 
          thumsrc = jObject.getString("thumsrc"); 
          largeimg = jObject.getString("largeimg"); 
          excert = jObject.getString("excert"); 
          description = jObject.getString("description"); 
          cat = jObject.getString("cat"); 
          postid = jObject.getInt("postid"); 
          /////////// stringArrayList.add(jObject.getString("cat")); 


          uniqueValues.add(jObject.getString("cat")); // Set unique elements in string array list 
          int a = 0; 
           if(a == 0){ 
            uniqueValues.add("All,"); 
            a = 1; 
           } 
          ccc = uniqueValues.toString(); 
          Log.d("unique","========================> " + ccc); 

          Log.d("talklog", "Title -> " + title + " , thumsrc -> " + thumsrc + " , largeimg -> " + largeimg 
            + " , excert -> " + excert + " , description -> " + description + " , cat -> " + cat + " , " + "PostId " + postid); 
          Log.d("talklog", "============================= end of " + i + " ==============================="); 

          tma = new TalkModelAll(); 
          tma.title = title; 
          tma.thumsrc = thumsrc; 
          tma.largeimg = largeimg; 
          tma.excert = excert; 
          tma.description = description; 
          tma.cat = cat; 
          tma.postid = postid; 

          m_ArrayList.add(tma); 

         } 

         String[] split_unique = ccc.split(","); 

         Arrays.sort(split_unique); 

         for(int i = 0; i < split_unique.length; i++){ 
          Log.d("split_unique", "====>><< " + split_unique.length); 
          Log.d("split_unique", "====>><< " + ccc.split(",")[i]); 
         } 

         // When we need dynamic number of text view's .. 
        final int N = split_unique.length; // total number of textviews to add 

        final TextView[] myTextViews = new TextView[N]; // create an empty array; 

        for (int i = 0; i < N; i++) { 
         // create a new textview 
         rowTextView = new TextView(getActivity()); 

         // set some properties of rowTextView or something talk_ll_uni 
         rowTextView.setText((split_unique[i].replaceAll("[|?*<\":>+\\[\\]/']", "") + " ").toUpperCase()); 
         rowTextView.setTextColor(getActivity().getResources().getColor(R.color.talk_red_bottom)); 
         rowTextView.setTextSize(25); 
         rowTextView.setId(i); 
         // add the textview to the linearlayout 
         myLinearLayout.addView(rowTextView); 



         // saving a reference to the textview for later 
         myTextViews[i] = rowTextView; 
        } 


         //if you want your array 
        ///// String [] stringArray = stringArrayList.toArray(new String[stringArrayList.size()]); 


      } 

      taa = new TalkArrayAdapter(getActivity(), m_ArrayList); 
      lv = (ListView) getActivity().findViewById(R.id.talk_list); 
      lv.setVisibility(View.VISIBLE); 
      lv.setAdapter(taa); 

      lv.setOnItemClickListener(new OnItemClickListener() { 

       @Override 
       public void onItemClick(AdapterView<?> arg0, View arg1, 
         int arg2, long arg3) { 
        // TODO Auto-generated method stub 

        TalkDetail fragment = new TalkDetail(); 
        Bundle bundle = new Bundle(); 

        bundle.putString("title", m_ArrayList.get(arg2).title); 
        bundle.putString("largeimg", m_ArrayList.get(arg2).largeimg); 
        bundle.putString("excert", m_ArrayList.get(arg2).excert); 
        bundle.putString("description", m_ArrayList.get(arg2).description); 
        bundle.putString("cat", m_ArrayList.get(arg2).cat); 
        //bundle.putInt("postid", m_ArrayList.get(arg2).postid); 

        fragment.setArguments(bundle); 
        ((BaseContainerFragment)getParentFragment()).replaceFragment(fragment, true); 

       } 
      }); 

     }catch(Exception e){ 
      e.printStackTrace(); 
     } 

     //pDialog.dismiss(); 

    } 

} 

}

Я гугл много, но не в состоянии получить точную точку. Я также проверил это на разных методах, используя другие предложенные материалы на StackOverFlow.

Заранее благодарим за сотрудничество.

+0

просто проверьте одно условие, что ранее загруженные данные доступны или нет. Если доступные средства не выполняются иначе, выполняйте. – Yugesh

+0

@AndroidHacker Я думаю, что вы хотите сохранить ранее загруженные данные, потому что вы не хотите повторно запускать AsyncTask для извлечения тех же данных. Я прав, или ваша проблема - это что-то еще. – guptakvgaurav

+0

@GauravGupta Да, моя проблема заключается в том, чтобы остановить выполнение AsyncTask снова и снова, сохраняя все ранее загруженные данные. – AndroidHacker

ответ

2

Для этого..Первая всякий раз, когда вы снова возвращаетесь обратно к fragment, вы должны проверить, выполнено ли уже Asynchtask или нет .. это означает проверить с загруженными данными. Если данные нулевые, у вас есть данные о загрузке, иначе вам не нужно для звонка Asynchtask againn ..

В вашем фрагменте поддерживается один логический флаг .. в onPostExecute устанавливается его значение true .. при каждом перемещении одной вкладки на другой фрагмент будет удален и снова добавлен так в ваш метод onCreateView, если boolean flag is false выполнить asynchtask .. данные об уже загружены.

или сохранить один класс singleton т ваших загруженных данных снова двигается назад к данным активности гата от одноплодного класса, и если данные нулевой нагрузка от нагрузки и установить в класс одноплодного ..

В вашем onDestroy() методы fragment остановить AsynchTask как это ..

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    if (applicationLoadTask != null) { 
     if (!applicationLoadTask.isCancelled()) { 
      applicationLoadTask.cancel(true); 
     } 
    } 
} 
+0

Спасибо за ваш быстрый ответ .. Я пробовал это, но не работал. Будем благодарны вам, если вы можете быть более конкретными в этом вопросе. :) – AndroidHacker

+0

, несмотря на то, что AsynTask отменен, он не прекратит выполнение его работы на заднем плане. просто он не будет вызывать onPOstExecute(), и дело в том, что мы не можем останавливать потоки в Java. –

+0

ok..wait я выложу..большой код .. –

0

Вам необходимо создать класс, в котором будут храниться данные, которые вы только что извлекли из выполнения AsyncTask. В onPostExecute() сохраняются извлеченные данные в объекте этого класса, а в каком-либо другом методе (например, A()) отображаются данные из объекта класса в ваши представления.

Когда вы будете перемещаться между вкладками, проверьте, есть ли у этого объекта данные, если он тогда вызвал A(), в противном случае повторно выполнить задачу Async для извлечения данных.

Это похоже на проблему с дизайном.

// cancelling asynck-task if it is running 

if(yourTask.getStatus() == AsyncTask.Running){ 
    yourTask.cancel(); 
} 

Аналогичным образом вы можете проверить другие состояния async-задачи в соответствии с вашими требованиями. this

+0

Спасибо за вашу заботу. Я думаю, что моя проблема может заключаться в размещении AsyncTask и последующей загрузке. – AndroidHacker

Смежные вопросы