2012-02-26 5 views
1

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

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

компилятор жалуется на «Отсутствует закрытый экземпляр типа KeywordSearch доступен»

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

Как я могу выполнить задачу async без сбоев?

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

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.. 
    } 
} 

ответ

3

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

, например,

int foo; 

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

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

// в вашей задаче async вы можете сделать это в 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. 
+0

вы имеете в виду, если я двигаю асинхронной задачу вне дома? так вот как я передам все свои vars в асинхронный класс? – tom91136

+0

да таким образом вы можете передавать переменные и использовать их в любом месте вашего класса asyncTask. – Sunny

+0

и выполните класс async как 'new SearchTask (ваши varaibles здесь) .execute();' – Sunny

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