2016-03-25 16 views
0

現在のシナリオ:複数のURLの画像をSDキャッシュに保存し、ListViewに表示するアプリの例。Androidスレッド通信AsyncTask

タスク:MainActivityでプライベートメソッド内でハードコードされたURLを取得する代わりに、URLリソースに配置されたJSONデータからそれらを取得します。

は私が.. JSONを取得しても、データを解析するが、私は返されたリストは、後に来ているようですので、これはMyImageLoaderAdapterにデータを解析された送信方法についての困難を抱えているんだ

ファイル:MainActivity.java

public class MainActivity extends Activity {  
    ... 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
     try{ 
      SimpleAsyncTask mTask = new SimpleAsyncTask(); 
      mTask.execute(resource); 
      ArrayList list = mTask.list; 
      String[] strArray = new String[ list.size() ]; 
      int length = strArray.length; // lenght = 0 
      mStrings = new String[ list.size() ]; 
      int length = strArray.length; 
      for(int j = 0; j < length; j++) { 
       mStrings[j] = list.get(j).toString(); 
      } 

     }catch (Exception e){} 

     // Create custom adapter for listview 
     adapter=new MyImageLoadAdapter(this, mStrings); 
     ... 
    } 

    private String[] mStrings={ 
     "http://resourse1.com", 
     "http://resourseN.com", 
    };  
} 

ファイル:SimpleAsyncTask.java

public class SimpleAsyncTask extends AsyncTask<String, String, String>{ 
    ArrayList list = new ArrayList(); 
    protected String doInBackground(String... uri) { 
     //working code 
    } 


    @Override 
    protected void onPostExecute(String response) { 
     super.onPostExecute(response); 
     ... 
     return list //expected value; 
    } 
} 

答えて

1

あなたはこのようにそれを行うことができ、次のよう

public class MainActivity extends Activity implements OnTaskCompleteListener{  

private ArrayList list; 
    ... 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     ... 
     try{ 
      SimpleAsyncTask mTask = new SimpleAsyncTask(); 
      mTask.execute(resource); 
     }catch (Exception e){} 


     ... 
    } 

    private String[] mStrings={ 
     "http://resourse1.com", 
     "http://resourseN.com", 
    }; 

    @Override 
    private void onTaskComplete(ArrayList taskList){ 
    list = taskList; 
      //String[] strArray = new String[ list.size() ]; 
      //int length = strArray.length; // lenght = 0 
      //mStrings = new String[ list.size() ]; 
      //int length = strArray.length; 
      //for(int j = 0; j < length; j++) { 
      // mStrings[j] = list.get(j).toString(); 
      //} 
//Instead of the above code you can also use this 
String[] array = list.toArray(new String[list.size()]); 

// Create custom adapter for listview 
adapter=new MyImageLoadAdapter(this, array);  
} 
     } 

今すぐあなたのAsynctaskを変更:

public class SimpleAsyncTask extends AsyncTask<String, String, String>{ 

private OnTaskCompleteListener listener; 

public SimpleAsyncTask(OnTaskCompleteListener listener) { 
    this.listener = listener; 
} 

    protected String doInBackground(String... uri) { 
     //working code 
    } 


    @Override 
    protected void onPostExecute(String response) { 
     super.onPostExecute(response); 
     ...//Convert the response to list and call your listener 
listener.onTaskComplete(list); 
     // return list //expected value;// no need of it now. 
    } 
} 

はあなたのパッケージのインターフェイスを作成します。

public interface OnTaskCompleteListener { 
void onTaskComplete(ArrayList list); 
} 

onpostexecuteはあなたが渡されたインタフェースオブジェクトを使用して、アクティビティに実装メソッドを呼び出している非同期タスクに呼び出された後、ここであなたは、あなたの活動のインタフェースを実装し、それを作成しながら、非同期タスクにそれを渡しています。

これが役に立ちます。

+0

これは私が探していたものです。ありがとうございました。 –