簡體   English   中英

Android線程通訊AsyncTask

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM