简体   繁体   English

在完成测试异步任务之前,ImageDownload asynctask即将开始

[英]ImageDownload asynctask is getting start before test asynctask complted

public class DetailsActivity extends Activity {

private ArrayAdapter<Imageclass> adapter;
ArrayList<String> imageselect = new ArrayList<String>();
private ArrayList<Imageclass> array1;
private ArrayList<Imageclass> list = new ArrayList<Imageclass>();
//private ArrayList<Imageclass> array;
ArrayList<String> imagetest = new ArrayList<String>();
private TextView textView1; 
private TextView textView2;
private TextView textView3;
private TextView textView4;
private TextView textView5;
int id;
int pid;
int val;
int val_new;
double lati;
double longi;
String imagename;
//private ImageView image;
//public static final String URL = "http://theopentutorials.com/totwp331/wp-content/uploads/totlogo.png";
ImageView image;
static Bitmap bm;
ProgressDialog pd;


BitmapFactory.Options bmOptions;

public class test extends AsyncTask<Void, Void, InputStream>{

    ArrayList<Imageclass> str;

    private DetailsActivity activity;


    public test(DetailsActivity activity){
        this.activity = activity;
    }


    @Override
    protected InputStream doInBackground(Void... params) {

        //String stringURL = "http://192.168.2.104:8088/Image/MyImage" + String.format("?id=%d",id); 
        Log.e("Checking id",""+id);

        String stringURL = "http://megavenues.org/mobile_json/get_images" + String.format("?id=%d",id);
        URL url; 
        try {
            stringURL=stringURL.replaceAll(" ", "%20");

            url = new URL(stringURL);
            Log.e("URL",""+ url); 

            URLConnection conn= url.openConnection();

            Log.e("URLConnection",""+conn );
            InputStream stream= conn.getInputStream(); 

            Log.e("URLStream",""+stream );

            return stream; 
        } catch (MalformedURLException e) { 

            e.printStackTrace();
        } catch (IOException e) {

            Log.e("Excepiton", ""+e);
            e.printStackTrace();
        }
        return null;
    }       

    @Override
    protected void onPostExecute(InputStream result) {
        super.onPostExecute(result);
        Log.e("Result", ""+result);
        StringBuilder builder = new StringBuilder();
        Log.e("Builder", ""+ builder);
        BufferedReader reader = new BufferedReader(new InputStreamReader(result));
        Log.e("Reader", ""+ reader);

        String line = null;
        try {
            while((line = reader.readLine()) != null) {
                Log.e("Result11", ""+ builder.append(line));
                builder.append(line);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }


        String jsonString = builder.toString();
        Log.e("image", jsonString);

        try {

            JSONObject rootObject = new JSONObject(jsonString);
            Log.e("JSOnObject",""+ rootObject);
            JSONArray jsonArray = rootObject.getJSONArray("tbl_ads_images");        
            //array1.clear();
            ArrayList<String> imagearray = new ArrayList<String>();
            for (int index = 0; index < jsonArray.length(); index++) {
                Imageclass imageinstance = new Imageclass(); 

                JSONObject object = (JSONObject) jsonArray.get(index);
                Log.e("Image test", "" + object);
                imageinstance.image = object.getString("file_name");

                //### this contain the image name
                Log.e("Imageinstance.image",""+imageinstance.image);

                imagename = imageinstance.image;
                imagearray.add(imageinstance.image);


                array1.add(imageinstance);
                //array1.add(imagearray);
                Log.e("array1","test"+array1);
            }
            Log.e("IMAGES",""+array1);
            activity.setlist(array1);


        }       
        catch (JSONException e) {
            Log.e("this Exception",""+ e);
            e.printStackTrace();
        }
        catch (Exception e) {
            Log.e("NULL","NULL"+e);
        }

        //  adapter.notifyDataSetChanged();


    }

}

public class ImageDownload extends AsyncTask<String, Void, String> {

    protected String doInBackground(String... param) {
        bmOptions = new BitmapFactory.Options();
        bmOptions.inSampleSize = 1;

        String imageUrl ="http://megavenues.com/assets/uploads/users/"+val+"/ads/thumbnail/"+Finalname;
        Log.e("inside img",""+Finalname);
        Log.e("inside img_val",""+val);
        Log.e("Check","check"+imageUrl);
        loadBitmap(imageUrl, bmOptions);
        return imageUrl;
    }

    protected void onPostExecute(String imageUrl) {
        pd.dismiss();
        if (!imageUrl.equals("")) {
            Log.e("Test","Test"+ imageUrl.equals(""));
            image.setImageBitmap(bm);
        } else {
            Toast.makeText(DetailsActivity.this,
                    "test", Toast.LENGTH_LONG)
                    .show();
        }
    }

}

public static Bitmap loadBitmap(String URL, BitmapFactory.Options options) {
    InputStream in = null;
    try {
        in = OpenHttpConnection(URL);
        bm = BitmapFactory.decodeStream(in, null, options);
        in.close();
    } catch (IOException e1) {
    }
    return bm;
}

private static InputStream OpenHttpConnection(String strURL)
        throws IOException {
    InputStream inputStream = null;
    URL url = new URL(strURL);
    URLConnection conn = url.openConnection();

    try {
        HttpURLConnection httpConn = (HttpURLConnection) conn;
        httpConn.setRequestMethod("GET");
        httpConn.connect();

        if (httpConn.getResponseCode() == HttpURLConnection.HTTP_OK) {
            inputStream = httpConn.getInputStream();
        }
    } catch (Exception ex) {
    }
    return inputStream;
}

String Finalname;

//String imageUrl ="http://megavenues.com/assets/uploads/users/220/ads/thumbnail/"+Finalname;
public void setlist(ArrayList<Imageclass> list)
{
    this.list= list; 
    Log.e("LIST",""+ this.list);
    String imagename1 = list.toString();
    Log.e("image new value",""+imagename1);
    this.list= list; 
    Log.e("testing",""+ this.list); 
    for (int i=0; i < list.size(); i++)
    { 
        Log.e("new check",""+list.get(i));
        //String test2= list.get(i).toString();
        imagetest.add(list.get(i).toString());  
        Finalname = list.get(i).toString();
        getimage_name(Finalname);
        Log.e("Come",""+list.get(i).toString());
        Log.e("Finalname",""+Finalname);
    }
}
//String imageUrl ="http://megavenues.com/assets/uploads/users/"+val+"/ads/thumbnail/"+Finalname;

private void getimage_name(String finalname2) {


}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_details);
    image = (ImageView)findViewById(R.id.imageView2);


    //  getMenuInflater().inflate(R.menu.details);
    //R.id.textDetailPlace 
    textView1 = (TextView)findViewById(R.id.textDetailPlace);
    textView2 = (TextView)findViewById(R.id.textDetailAddress ); 
    textView3 = (TextView)findViewById(R.id.textCapacity);
    //  textView4 = (TextView)findViewById(R.id.textDetailContactNo);
    textView5 = (TextView) findViewById(R.id.textViewDescription);


    textView1.setText(getIntent().getExtras().getString("test"));
    textView2.setText(getIntent().getExtras().getString("test2"));
    textView3.setText(getIntent().getExtras().getString("test3"));
    //textView4.setText(getIntent().getExtras().getString("test4"));
    textView5.setText(getIntent().getExtras().getString("test5"));

    id = getIntent().getExtras().getInt("test6");
    Log.e("ID value",""+id);

    pid = getIntent().getExtras().getInt("test7");
    Log.e("PID value",""+pid);

    lati = getIntent().getExtras().getDouble("testlat");
    Log.e("long",""+lati);
    longi = getIntent().getExtras().getDouble("testlong");
    Log.e("long",""+longi);
    val=pid;
    Log.e("val",""+val);
    ActionBar actionBar = getActionBar();
    actionBar.hide();
    pd = ProgressDialog.show(DetailsActivity.this, null, null,true);
    pd.setContentView(R.layout.progress);
    array1 = new ArrayList<Imageclass>();
    //new test(this).execute();

    new test(this).execute();

here test asynctask is called 这里测试asynctask被称为

    Log.e("JUST","CHECK");
    Log.e("JUST","CHECK");


    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

here imageDownload asynctask is getting called:: 在这里imageDownload asynctask被调用:

    new ImageDownload().execute();

        Log.e("imagename",""+imagename);
}
}

here before ImageDownload is start executing before test async task is complete 在测试异步任务完成之前开始执行ImageDownload之前

and i am not able to get the status of the task can u tell how it is done 我无法获得任务的状态,你能告诉它如何完成

无论我从中了解到什么,您想在任务线程之后执行ImageDownload线程,因此从任务线程的onPostExecute()启动ImageDownload线程

When executing an async task a new thread is started, but your current thread keeps running. 执行异步任务时,将启动一个新线程,但是您当前的线程将继续运行。 It immediately runs into your thread.sleep(1000) just after starting test.async. 在启动test.async之后,它立即运行到您的thread.sleep(1000)中。

It looks like your doing some internet downloading in test.async, and as you might have guessed, it takes longer than 1000 milliseconds (1 second). 看起来您在test.async中进行了一些Internet下载,并且您可能已经猜到了,它花费的时间超过1000毫秒(1秒)。 This means 1 second later, your other async is starting, before the first completed. 这意味着1秒钟后,您的另一个异步程序将在第一次完成之前开始。

I assume you want to stagger them. 我想你想错开它们。 In the postExecute of the first async, you can spawn the second async. 在第一个异步的postExecute中,可以生成第二个异步。 A more stylistically correct method would be to implement an interface on your activity that takes a callback on Async completion, then upon receiving the call back, launch your second async. 在样式上更正确的方法是在您的活动上实现一个接口,该接口在异步完成时进行回调,然后在收到回叫后启动第二个异步。

An example of how to structure this is below. 下面是一个如何构造它的示例。

interface AsyncCallback{
void onAsyncComplete();
}

public class ExampleActivity extends Activity implements AsyncCallback {

....

public void launchFirstAsync(){
    new Task(this).execute();
}


@Override
public void onAsyncComplete() {
    //todo launch second asyncTask;

   }
}

class Task extends AsyncTask<Void, Void, Void>{

AsyncCallback cb;

Task(AsyncCallback cb){
    this.cb = cb;
}

@Override
protected Void doInBackground(Void... params) {
    // TODO Auto-generated method stub
    return null;
}

@Override
protected void onPreExecute() {
    // TODO Auto-generated method stub
    super.onPreExecute();

    cb.onAsyncComplete();
}

} }

Have a look here, This Help me for same..Pass your url to GetTemplateImageController and get the result in Bitmap array 看看这里,这对我有帮助。将您的网址传递给GetTemplateImageController并在Bitmap数组中获取结果

GetTemplateImageController Class: GetTemplateImageController类:

 public class GetTemplateImageController  extends AsyncTask<String, Void, Bitmap[]>
    {
        Context mcontext;
        private ProgressDialog pDialog;
        public static  String[] imageurls;
        public static Bitmap bm[]=new Bitmap[15];
        // URL to get JSON
        private static final String url= "http://xxx.xxx.xxx.xxx/image_master.php?";
        private static final String TEMPLATE = "Template_images";
        private static final String IMAGEURLS = "tempimagename";
        // JSONArray
        JSONArray loginjsonarray=null;
        //result from url
        public GetTemplateImageController(Context c) {
            this.mcontext=c;
        }
        protected void onPreExecute() {
            // Showing progress dialog
            super.onPreExecute();
            pDialog=new ProgressDialog(mcontext);
            pDialog.setMessage("Loading");
            pDialog.setCancelable(true);
            pDialog.setIndeterminate(true);
            pDialog.show();
        }
        protected Bitmap[] doInBackground(String... arg) {
            List<NameValuePair> params = new ArrayList<NameValuePair>();
            params.add(new BasicNameValuePair("templateMasterId",arg[0].toString()));
            // Creating service handler class instance
            ServiceHandler sh = new ServiceHandler();
             // Making a request to url and getting response
            String jsonstr = sh.makeServiceCall(url, ServiceHandler.POST, params);
            Log.d("Response: ", ">"+jsonstr);
            if(jsonstr!=null)
            {
            try {
                JSONObject jsonObj =new JSONObject(jsonstr);
                loginjsonarray=jsonObj.getJSONArray(TEMPLATE);
                imageurls=new String[loginjsonarray.length()];
                for(int i=0;i<loginjsonarray.length();i++)
                {
                JSONObject l=loginjsonarray.getJSONObject(i);
                imageurls[i]=l.getString(IMAGEURLS);
                }
                for(int i=0;i<imageurls.length;i++){    
                 bm[i]=DownloadImage(imageurls[i]);
                }
                }catch(JSONException e){
                e.printStackTrace();
                }
              }else{
                Toast.makeText(mcontext,"Check your Internet Connection",Toast.LENGTH_SHORT).show();
              }
                return bm;
           }
        public Bitmap DownloadImage(String STRURL) {
            Bitmap bitmap = null;
            InputStream in = null;       
            try {
                int response = -1;
                URL url = new URL(STRURL);
                URLConnection conn = url.openConnection();
                if (!(conn instanceof HttpURLConnection))             
                throw new IOException("Not an HTTP connection");
                try{
                HttpURLConnection httpConn = (HttpURLConnection) conn;
                httpConn.setAllowUserInteraction(false);
                httpConn.setInstanceFollowRedirects(true);
                httpConn.setRequestMethod("GET");
                httpConn.connect();
                response = httpConn.getResponseCode();  
                if (response == HttpURLConnection.HTTP_OK) {
                in = httpConn.getInputStream();
                }                    
                }catch(Exception ex) {
                throw new IOException("Error connecting"); 
                }
                bitmap = BitmapFactory.decodeStream(in);
                in.close();
                }catch (IOException e1) {
                e1.printStackTrace();
                }
                return bitmap; 
            }
        protected void onPostExecute(Integer result) {
            // Dismiss the progress dialog

             pDialog.dismiss();
             if(result != null)
                    Toast.makeText(mcontext,"Download complete", Toast.LENGTH_SHORT).show();

            //}
        }
    }

ServiceHandler Class: ServiceHandler类:

    public class ServiceHandler {
        static String response = null;
        public final static int GET = 1;
        public final static int POST = 2;
        public String makeServiceCall(String url, int method) {
            return this.makeServiceCall(url, method, null);
        }
        /**
         * Making service call
         * @url - url to make request
         * @method - http request method
         * @params - http request params
         * */
        public String makeServiceCall(String url, int method, List<NameValuePair> params)  {
            try {
                    DefaultHttpClient httpClient=new DefaultHttpClient();
                    HttpEntity httpEntity=null;
                    HttpResponse httpResponse=null;
                    // Checking http request method type
                    if(method==POST){
                        HttpPost httpPost=new HttpPost(url);
                        if(params!=null)
                        {
                            //adding post params
                            httpPost.setEntity(new UrlEncodedFormEntity(params));
                        }
                        httpResponse=httpClient.execute(httpPost);
                    }
                    else if(method==GET)
                    {
                        // appending params to url
                        if(params!=null)
                        {
                            String paramString=URLEncodedUtils.format(params, "utf-8");
                            url +="?"+paramString;
                        }
                        HttpGet httpGet=new HttpGet(url);
                        httpResponse=httpClient.execute(httpGet);
                    }
                    httpEntity=httpResponse.getEntity();
                    response=EntityUtils.toString(httpEntity);
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return response;
        }
}

Over time there have been several changes to the way Android deals with AsyncTasks that run concurrently. 随着时间的流逝,Android处理并发运行的AsyncTask的方式发生了一些变化。 In very old Android versions (pre-1.6 afaik) multiple AsyncTasks were executed in sequence. 在非常老的Android版本(1.6 afaik之前的版本)中,依次执行了多个AsyncTask。 That behavior has been changed to run the AsyncTasks in parallel up until Android 2.3. 该行为已更改为在Android 2.3之前并行运行AsyncTasks。 Beginning with Android 3.0 the the Android team decided that people were not careful enough with synchronizing the tasks that run in parallel and switched the default behavior back to sequential execution. 从Android 3.0开始,Android团队决定人们在同步并行运行的任务时并不足够谨慎,并将默认行为切换回顺序执行。 Internally the AsyncTask uses an ExecutionService that can be configured to run in sequence (default) or in parallel as required: 在内部,AsyncTask使用ExecutionService,可以将其配置为按顺序运行(默认)或根据需要并行运行:

ImageLoader imageLoader = new ImageLoader( imageView );
imageLoader.executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR, "http://url.com/image.png"    );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM