2016-03-23 8 views
-3

別のクラスにAsyncTaskを作成し、インターフェイスJava.lang.ClassCastExceptionを使用して値を返そうとするとキャストできません。私がアクティビティを使って同じことをした場合は、すべてうまく動作しますが、アダプタを使用すると、動作させることができませんでした。その理由はわかりません。誰かがお勧めしますか?AsyncTaskを別のクラスに作成し、interfaceを使用してAsyncTaskから値を返そうとしています。 Java.lang.ClassCastExceptionをキャストできません

  /* Separate Java class extends AsyncTask*/ 
      public class Task extends AsyncTask<String,String,String> 
      { 
       /* Declaraing required variables */ 
       Context context; 
       TaskCompleted taskCompleted; 
       public Task(Context context){ 
       this.context = context; 

       /* The problem is right in this line */   
       /* Java.lang.ClassCastException cannot be cast.*/ 
       this.taskCompleted = (TaskCompleted) context; 
      } 
      @Override 
      protected void onPreExecute() { 
       super.onPreExecute(); 
      } 

      @Override 
      protected String doInBackground(String... params) { 
      //Return string value 
      return "hello"; 
      } 
       @Override 
       protected void onPostExecute(String s) { 
       super.onPostExecute(s); 
       //add string value 
       taskCompleted.output(s); 
      } 
      } 
      /*Interface class to store asynctask value */ 
      public interface TaskCompleted { 
      /* Method to get value set from asynctask */ 
      public void output(String value); 
      } 
      /*If i did the same thing using activity 
      everything works fine but using Adapter i m not been able 
      to make it work i dont know the reason behind it. Can 
      someone please suggest.*/ 

      /* Adapter Class implements Interface Class */    
      public class Adapter extends BaseAdapter implements 
      TaskCompleted { 
      /* Declaring the variable */ 
      private Context context; 
      private List<String> list; 
      private LayoutInflater inflater; 

     /* Create Constructor to send required value */ 
     public Adapter(Context context, List<String> list) { 
     /* Setting up value */ 
     this.context = context; 
     this.list = list; 
     inflater = LayoutInflater.from(this.context); 
     } 

     @Override 
     public int getCount() { 
      /* Size of ArrayList */ 
     return list.size(); 
     } 

     @Override 
     public String getItem(int position) { 
     /* return value of particular position */ 
     return list.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
     return 0; 
     } 
     /*Get View from here for just to test*/ 
     @Override 
     public View getView(int position, View convertView, ViewGroup 
     parent) { 
     /* Call class to get views */ 
     MyViewHolder mViewHolder; 

     //get custom layout 
     if (convertView == null) { 
      convertView = inflater.inflate(R.layout.custom_layout, 
     parent, false); 
      //initialize view holder class 
      mViewHolder = new MyViewHolder(convertView); 
      convertView.setTag(mViewHolder); 
     } else { 
      mViewHolder = (MyViewHolder) convertView.getTag(); 
     } 

     mViewHolder.nameTextView.setText(list.get(position)); 

     //add listener 
     mViewHolder.nameTextView.setOnClickListener(new 

     View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //Call AsyncTask class to execute 
       new Task(context).execute(); 
       } 
      }); 
      return convertView; 
      } 

      @Override 
      public void output(String value) { 
     /*Printing value*/ 
     Toast.makeText(context,value+" From 
      Interface",Toast.LENGTH_LONG).show(); 
      } 

      private class MyViewHolder { 
       TextView nameTextView; 

       public MyViewHolder(View item) { 
       /* Get view from layout */ 
       nameTextView = (TextView)  
       item.findViewById(R.id.nameId); 
       } 
       } 
      } 
+3

コードを投稿してください。 – crashOveride

+0

はい私はコードを投稿しました.. – user3797004

+0

アクティビティからアダプタへのコンテキストの送信を試み、アダプタからasynctaskへの送信を試行してください –

答えて

0

変更してみてください:

new Task(context).execute(); 

へ:

new Task(Adapter.this).execute(); 

アダプタはインタフェースではなく、コンテキストの実装です。

0

アダプタから非同期タスクを呼び出す場合は、次のフローを使用します。 アダプタから呼び出すので、アクティビティのインスタンスを渡す必要があるため、非同期タスクの結果はアクティビティのインターフェイスに移動します。そこからアダプタメソッドを呼び出します。

Adapter{ 
Activity mActivity; 
Adapter(Activity activity){ 
mActivity = activity; 
yourAsyncTask async = new AsyncTask(activity); 
async.execute(url); 
} 
public void asyncTaskResult(){ 
//Do what you want to do here. 
} 

} 


Your AsyncTask{ 
Activity mActivity; 
AysncTask(Activity activity){ 
mActivity = activity; 
} 

onPostExecute(){ 
((YourInterface)mActivity).resultMethod(); 

} 

} 

Interface YourInterface(){ 
public void resultMethod(); 

} 

Your Activity Implements YourInterface{ 

@Override 
public void resultMethod(){ 
yourAdapter.asyncTaskResult(); 

} 

} 
関連する問題