簡體   English   中英

Android-從線程返回值

[英]Android - return value from thread

我有一個從資源檢索圖像並將其顯示在GridView 一切都可以正常工作,但是由於性能問題,我想在運行時創建拇指,因此我創建了一個新的ProgressDialog來告知用戶該應用程序正在運行:

import java.util.ArrayList;

import android.app.Fragment;
import android.app.ProgressDialog;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.InflateException;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;

import com.italiandevteam.chuck.adapter.GridViewAdapter;
import com.italiandevteam.chuck.model.ImageItem;

public class GalleriaPersonaggio extends Fragment{

    Integer personaggio = null;
    private ProgressDialog progressDialog;
    TypedArray imgs = null;

    final ArrayList imageItems = new ArrayList();

    public GalleriaPersonaggio( int personaggio ){

        this.personaggio = personaggio;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        int id = getIdPersonaggio();

        View rootView = null;

        try {
                rootView = inflater.inflate(R.layout.gallery_grid, container, false);
            } 
        catch (InflateException e) {
        }

        final GridView gridView = (GridView) rootView.findViewById(R.id.gridView);
        GridViewAdapter customGridAdapter = new GridViewAdapter(getActivity(), R.layout.gallery_row, getData(personaggio));
        gridView.setAdapter(customGridAdapter);

        gridView.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
//              HashMap<String, Object> hm = gridView.getAdapter().getPosition(position);
//
//                 String imgPath = (String) hm.get("flag"); //get downloaded image path
//              Intent i = new Intent(getActivity(), MostraImmagine.class); //start new Intent to another Activity.
//              i.putExtra("ClickedImagePath", imgPath ); //put image link in intent.
//              startActivity(i);
            }

    });

        return rootView;
    }

    public int getIdPersonaggio(){
        return this.personaggio;
    }

    private ArrayList getData(int personaggio) {

        // retrieve String drawable array

        switch( personaggio )
        {        
            case 1:{
                imgs = getResources().obtainTypedArray(R.array.chuck_ids);
                break;
            }
            case 2:{
                imgs = getResources().obtainTypedArray(R.array.sarah_ids);
                break;
            }

            default:{
                imgs = getResources().obtainTypedArray(R.array.chuck_ids);
            }

        }



        final ProgressDialog ringProgressDialog = ProgressDialog.show(getActivity(), "Please wait ...", "Loading Images ...", true);
                ringProgressDialog.setCancelable(true);
                    new Thread(new Runnable() {
                        @Override
                        public void run() {
                            try {

                                int THUMBNAIL_HEIGHT = 100;
                                int THUMBNAIL_WIGHT = 100;
                                for (int i = 0; i < imgs.length(); i++) 
                                {
                                    Bitmap bitmap = BitmapFactory.decodeResource(getActivity().getResources(), imgs.getResourceId(i, -1));
                                    bitmap = Bitmap.createScaledBitmap(bitmap, THUMBNAIL_HEIGHT, THUMBNAIL_WIGHT, false);
//                                  ByteArrayOutputStream baos = new ByteArrayOutputStream();  
//                                  bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
//                                  byte[] imageData = baos.toByteArray();
//                                  InputStream is = new ByteArrayInputStream(imageData);
//                                  Bitmap b = BitmapFactory.decodeStream(is);
                                    imageItems.add(new ImageItem(bitmap, "Image#" + i));
                                }

                            } catch (Exception e) {

                            }
                            ringProgressDialog.dismiss();
                        }

                    }).start();


        return imageItems;

    }
}

問題是,最后代碼沒有返回任何內容, GridView為空,如果我刪除線程,它將很好地工作。

線程實例不能返回值,因為run方法的返回類型為void。 您可以做的是實現delegate模式(Android中的監聽器),或切換到Callable接口和Executors 請注意,等待返回類型沒有什么意義。 如果您有以下事情:

偽代碼UIThread:

variable = threadInstance.getResult();

您進行了異步調用,同步

正如323go所指出的,您可以使用AsyncTask (更好的IMHO)。 創建一個這樣的內部類:

private class MyAsyncTask extends AsyncTask<ArrayList<String>, Integer, Long> {
    ...
}

Integer用於更新進度對話框(如果您不需要,請放Void代替); Long是DoInBackground方法的結果。 像這樣啟動您的AsyncTask:

new MyAsyncTask().execute(passing);

現在我不知道您的目標是什么,但是如果您遵循323go或本教程建議的鏈接,則可以改進代碼。

編輯

在323go注釋之后,最好在AsyncTask構造函數中傳遞對象的ArrayList:

new MyAsyncTask(passing).execute();

當然,在AsyncTask類中,您必須創建一個內部變量:

...
private ArrayList<Object> myArrayList;

private MyAsyncTask(ArrayList<Object> anArrayList) {
    myArrayList = anArrayList;
}
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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