【问题标题】:Android thread communication AsyncTaskAndroid线程通信AsyncTask
【发布时间】:2016-03-25 11:11:22
【问题描述】:

当前场景: 示例应用程序将来自多个 URL 的图像存储在 SD 缓存中,并将它们显示在 ListView 中。

任务:而不是在 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;
    }
}

【问题讨论】:

    标签: java android json android-asynctask runnable


    【解决方案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);
    }
    

    在这里,您正在 Activity 中实现一个接口,在创建它时将其传递给异步任务,一旦在异步任务中调用 onpostexecute,您将使用传递的接口对象调用在 Activity 中实现的方法。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-28
      • 2016-04-18
      • 1970-01-01
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多