асинхронная задача в статическом классе - PullRequest
1 голос
/ 26 февраля 2012

я использую шерлок / фрагменты панели действий с моим приложением

моя проблема в том, что мне нужно вызвать асинхронную задачу для запуска во фрагменте, который является статическим классом

компиляторс жалобой на то, что «нет включающего экземпляра типа KeywordSearch»

Я думал о перемещении асинхронного класса и создании его собственного класса, но в моем классе KeywordSearch объявлено слишком много переменных, которые используются васинхронная задача

как выполнить асинхронную задачу без сбоев?

мой класс представления списка (фрагмент):

public static class ListFragment extends Fragment {
    private ListView list_list;
    private LazyAdapter adp_list;

    private KeywordSearch.SearchTask run;
    //run.execute();

    //new SearchTask().execute();


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);            
    }
    @Override   
    public void onDestroy()
    {
        if(!RTN_REQ.equals("SSDR") && data_got){
        adp_list.imageLoader.stopThread();
            }
        list_list.setAdapter(null);
        if(data_got)
        ImageLoader.clearCache(true,true);       
        super.onDestroy();      
    }
    @Override
    public void onPause()
    {
        /*
        if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT){
            list_list.setNumColumns(2);
        }else if(this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
            list_list.setNumColumns(3);
        }
        */
        super.onPause();
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.list, container, false);
        adp_list = new LazyAdapter(getActivity(),list_data, 0);
        run = new SearchTask();
        list_list = (ListView) v.findViewById (R.id.list);
        if(list_data != null){

            list_list.setAdapter(adp_list);
            list_list.setOnItemLongClickListener(new OnItemLongClickListener() {
                @Override
                public boolean onItemLongClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {               
                    String[] FINAL = list_data[arg2].split("##");
                    final Intent d = new Intent();
                    d.putExtra("DATA",FINAL[0]);
                    d.setClass(getActivity().getApplicationContext(), Details.class);   
                    startActivity(d);
                    return false;
                    }
            });           
            list_list.setOnItemClickListener(new OnItemClickListener(){
                @Override
                public void onItemClick(AdapterView<?> arg0, View arg1,int arg2, long arg3)
                {
                    if(!eno_act){
                        String[] FINAL = list_data[arg2].split("##");
                        final Intent i = new Intent(Intent.ACTION_VIEW);
                        i.setData(Uri.parse(FINAL[1]));                 
                        startActivity(i);
                    }else{
                        String[] FINAL = list_data[arg2].split("##");
                        level = 1;
                        level_filter = FINAL[2];
                        run.execute();  //this is where it crashes!!




                    }

                }
            });     
        }
        return v;
    }
}

и мой класс SearchTask:

 class SearchTask extends AsyncTask<Void, Void, String> {

    @Override
    protected void onPreExecute() {
        // TODO Auto-generated method stub
        //....to long to show..
    }

    @Override
    protected String doInBackground(Void... unsued) {
        //....to long to show..
    }

    @Override
    protected void onProgressUpdate(Void... unsued) {
        //....to long to show..
    }

    @Override
    protected void onPostExecute(String sResponse) {
        //....to long to show..
    }
}

1 Ответ

3 голосов
/ 26 февраля 2012

Передайте эти переменные вашего класса KeyWordSearch в конструктор класса асинхронных задач

, например,

int foo;   

public SearchTask(int foo)  //your variables here
{
    this.foo = foo;
}

. Для передачи примера данных

// в вашей асинхронной задачеможет сделать это в doInBackground или любым другим методом.Пусть foo - ваш строковый массив

 Bundle b = new Bundle();
 Intent i = new Intent(context, YourActivity.class)
 b.putExtraStringArray("myStringArray", foo);
 i.putExtras(b);

// Получите этот массив в вашей активности как

 String[] myArray =  this.getIntent().getStringArrayExtra("myStringArray"); //this should be done after executing asyncTask class.
...