2012-02-26 28 views
1

私は私のアプリでアクションバーのシャーロック/断片を使用してい非同期タスクが

私の問題は、私は

コンパイラは、静的クラスにあるフラグメントで実行する非同期タスクを呼び出す必要があるということです

"KeywordSearchタイプの包含可能なインスタンスがアクセスできない"という不満があります

私はasyncクラスを移動して独自のクラスを作成すると考えましたが、非同期で使用される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.. 
    } 
} 

答えて

3

は、例えば非同期タスククラス

のコンストラクタであなたの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); 

// iが私の非同期タスクを移動する場合は、意味

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