[英]Android thread communication AsyncTask
當前場景:示例應用程序,該應用程序將來自多個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;
}
}
您可以這樣做:
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,您便會使用傳遞的接口對象來調用在活動中實現的方法。
希望這可以幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.