簡體   English   中英

如何轉換為asynctask?

[英]How to convert to asynctask?

我的活動使用線程可以正常工作,但是當要從Web服務器數據庫中獲取10個或更多圖像時,這會花費很多時間。 從谷歌搜索中,我已經看到asynctask是一個更好的選擇,但是我無法實現它。 這是我的線程類

public class Ongoing extends Activity implements OnItemClickListener{

InputStream is;
ProgressDialog pd;
public int limit=0;
String F_NAME[]=new String[1000];
String F_ID[]=new String[1000];
String F_IMG[]=new String[1000];
String F_DESC[]=new String[1000];
String F_DOWN[]=new String[1000];
ListView lv1;
ArrayList<ItemDetails> image_details;

@Override

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  int SDK_INT = android.os.Build.VERSION.SDK_INT;

  if (SDK_INT>8)
  {

  StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

  StrictMode.setThreadPolicy(policy); 

  }

      setContentView(R.layout.submenu);

    lv1 = (ListView) findViewById(R.id.listV_main);


    lv1.setOnItemClickListener(this) ;
    pd=new ProgressDialog(this);
    pd.setTitle("Please wait");
    pd.setMessage("Loading....");
    pd.setCancelable(false);
    pd.show();

    new Thread(new Runnable()
    {
        @Override
        public void run()
        {

            GetSearchResults();


       //   hanlder.sendEmptyMessage(1);

             runOnUiThread(new Runnable() {
                 @Override
                 public void run() {
                     lv1 = (ListView) findViewById(R.id.listV_main);
                     adb=new ItemListBaseAdapter(Ongoing.this, results);
                     lv1.setAdapter(adb);
                     pd.cancel();
                 }
             });

        }
    }).start();

 }  
ItemListBaseAdapter adb;  
   private ArrayList<ItemDetails> results = new ArrayList<ItemDetails>();
private ArrayList<ItemDetails> GetSearchResults()
{
 try{ 
 String result = "";
try{
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(D.url+"abc.php");
    //httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
    Log.e("log_tag", "connection success ");

   }catch(Exception e){
    Log.e("log_tag", "Error in http connection "+e.toString());


   }

 try{
  BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso- 88591"),8);
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");

    }
    is.close();

    result=sb.toString();
  }catch(Exception e){
   Log.e("log_tag", "Error converting result "+e.toString());

  }

  try{


    JSONArray jArray = new JSONArray(result);
    int arrayLength=jArray.length();
    limit=arrayLength;
    for(int i=0;i<arrayLength;i++){
           JSONObject json_data = jArray.getJSONObject(i);

           F_NAME[i]=json_data.getString("F_NAME");
           F_DESC[i]=json_data.getString("F_DESC");
           F_ID[i]="ongopro"+json_data.getString("F_ID");
           F_IMG[i]=json_data.getString("F_IMG");
           F_DOWN[i]=json_data.getString("F_DOWNLOAD");
    }
   }
    catch(JSONException e){
        Log.e("log_tag", "Error parsing data "+e.toString());

  }                


    for(int j=0;j<limit;++j)
    {


         ItemDetails item_details = new ItemDetails();
        item_details.setName(F_NAME[j]);
        item_details.setItemDescription(F_DESC[j]);
        item_details.setImgUrl(F_IMG[j]);
        item_details.setLoc(F_DOWN[j]);
        results.add(item_details);
    }

 }
 catch(Exception e){
     Log.e("log_tag", "no msg sent "+e.toString());
     hanlder.sendEmptyMessage(2);

}
 return results;

}
@Override
 public void onItemClick(AdapterView<?> parent, View view,
      int position, long id) {
data.proj=F_DOWN[position];
 data.table=F_ID[position];
 data.flatname=F_NAME[position];

Intent newActivity = new Intent(view.getContext(),homescreen.class);     
    startActivity(newActivity);
  }}

下面是asynctask中的代碼(但不起作用,請編輯此代碼)

public class Ongoing extends Activity implements OnItemClickListener{

InputStream is;
ProgressDialog pd;
public int limit=0;
String F_NAME[]=new String[1000];
String F_ID[]=new String[1000];
String F_IMG[]=new String[1000];
String F_DESC[]=new String[1000];
String F_DOWN[]=new String[1000];
ListView lv1;
ArrayList<ItemDetails> image_details;
ItemListBaseAdapter adb;
@Override

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  int SDK_INT = android.os.Build.VERSION.SDK_INT;

  if (SDK_INT>8)
  {

   StrictMode.ThreadPolicy policy = new    StrictMode.ThreadPolicy.Builder().permitAll().build();

  StrictMode.setThreadPolicy(policy); 

  }

      setContentView(R.layout.submenu);

    lv1 = (ListView) findViewById(R.id.listV_main);


    lv1.setOnItemClickListener(this) ;
    pd=new ProgressDialog(this);
    pd.setTitle("Please wait");
    pd.setMessage("Loading....");
    pd.setCancelable(false);
    pd.show();

    load task=new load();
    task.execute();



 }  


public class load extends AsyncTask<Void, Void , ArrayList<ItemDetails>>
{
    public ArrayList<ItemDetails> results = new ArrayList<ItemDetails>();
    @Override
    protected ArrayList<ItemDetails> doInBackground(Void... params) {

        String result = "";
        try{
            HttpClient httpclient = new DefaultHttpClient();
            HttpPost httppost = new HttpPost(D.url+"abc.php");
            //httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            HttpResponse response = httpclient.execute(httppost); 
            HttpEntity entity = response.getEntity();
            is = entity.getContent();
            Log.e("log_tag", "connection success ");

    }catch(Exception e){
            Log.e("log_tag", "Error in http connection "+e.toString());


    }
    //convert response to string
    try{
  BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                    sb.append(line + "\n");

            }
            is.close();

            result=sb.toString();
    }catch(Exception e){
           Log.e("log_tag", "Error converting result "+e.toString());


    }

    //parse json data

    try{


            JSONArray jArray = new JSONArray(result);
            int arrayLength=jArray.length();
            limit=arrayLength;
            for(int i=0;i<arrayLength;i++){
                   JSONObject json_data = jArray.getJSONObject(i);

                   F_NAME[i]=json_data.getString("F_NAME");
                   F_DESC[i]=json_data.getString("F_DESC");
                   F_ID[i]="ongopro"+json_data.getString("F_ID");
                   F_IMG[i]=json_data.getString("F_IMG")+"";
                   F_DOWN[i]=json_data.getString("F_DOWNLOAD");
            }
    }
            catch(JSONException e){
                Log.e("log_tag", "Error parsing data "+e.toString());

        }                


            for(int j=0;j<limit;++j)
            {


                 ItemDetails item_details = new ItemDetails();
                item_details.setName(F_NAME[j]);
                item_details.setItemDescription(F_DESC[j]);
                item_details.setImgUrl(F_IMG[j]);
                item_details.setLoc(F_DOWN[j]);
                results.add(item_details);
            }

         }
         catch(Exception e){
             Log.e("log_tag", "no msg sent "+e.toString());
             hanlder.sendEmptyMessage(2);

         return results;

    }
    protected void onPostExecute() {


         adb=new ItemListBaseAdapter(Ongoing.this, results);
        lv1.setAdapter(adb);
        pd.dismiss();

}
    @Override
    protected void onPreExecute() {
}}
  @Override
   public void onItemClick(AdapterView<?> parent, View view,
      int position, long id) {
data.proj=F_DOWN[position];
 data.table=F_ID[position];
 data.flatname=F_NAME[position];

Intent newActivity = new Intent(view.getContext(),homescreen.class);     
    startActivity(newActivity);
 }}

您只需要移動GetSearchResults(); doInBackGround和ui部分到onPostExecute ..

例如:

protected String doInBackground(String... params) {
    GetSearchResults();
}

protected void onPostExecute(final String result) {
     lv1 = (ListView) findViewById(R.id.listV_main);
                 adb=new ItemListBaseAdapter(Ongoing.this, results);
                 lv1.setAdapter(adb);
                 pd.cancel();
}

請參考這些鏈接! --

1) 實現AsyncTask的技巧

2) 處理程序與AsyncTask與線程

3) AsyncTask Android示例

希望能幫助到你。

檢查一下我用asynctask編輯了您的代碼

public class Ongoing extends Activity implements OnItemClickListener{

InputStream is;
ProgressDialog pd;
public int limit=0;
String F_NAME[]=new String[1000];
String F_ID[]=new String[1000];
String F_IMG[]=new String[1000];
String F_DESC[]=new String[1000];
String F_DOWN[]=new String[1000];
ListView lv1;
ArrayList<ItemDetails> image_details;

@Override

public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  int SDK_INT = android.os.Build.VERSION.SDK_INT;

  if (SDK_INT>8)
  {

  StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();

  StrictMode.setThreadPolicy(policy); 

  }

      setContentView(R.layout.submenu);

    lv1 = (ListView) findViewById(R.id.listV_main);


    lv1.setOnItemClickListener(this) ;


   new Mytask.execute(null);

 }  
ItemListBaseAdapter adb;  
   private ArrayList<ItemDetails> results = new ArrayList<ItemDetails>();
private ArrayList<ItemDetails> GetSearchResults()
{
 try{ 
 String result = "";
try{
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(D.url+"abc.php");
    //httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
    HttpResponse response = httpclient.execute(httppost); 
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
    Log.e("log_tag", "connection success ");

   }catch(Exception e){
    Log.e("log_tag", "Error in http connection "+e.toString());


   }

 try{
  BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso- 88591"),8);
    StringBuilder sb = new StringBuilder();
    String line = null;
    while ((line = reader.readLine()) != null) {
            sb.append(line + "\n");

    }
    is.close();

    result=sb.toString();
  }catch(Exception e){
   Log.e("log_tag", "Error converting result "+e.toString());

  }

  try{


    JSONArray jArray = new JSONArray(result);
    int arrayLength=jArray.length();
    limit=arrayLength;
    for(int i=0;i<arrayLength;i++){
           JSONObject json_data = jArray.getJSONObject(i);

           F_NAME[i]=json_data.getString("F_NAME");
           F_DESC[i]=json_data.getString("F_DESC");
           F_ID[i]="ongopro"+json_data.getString("F_ID");
           F_IMG[i]=json_data.getString("F_IMG");
           F_DOWN[i]=json_data.getString("F_DOWNLOAD");
    }
   }
    catch(JSONException e){
        Log.e("log_tag", "Error parsing data "+e.toString());

  }                


    for(int j=0;j<limit;++j)
    {


         ItemDetails item_details = new ItemDetails();
        item_details.setName(F_NAME[j]);
        item_details.setItemDescription(F_DESC[j]);
        item_details.setImgUrl(F_IMG[j]);
        item_details.setLoc(F_DOWN[j]);
        results.add(item_details);
    }

 }
 catch(Exception e){
     Log.e("log_tag", "no msg sent "+e.toString());
     hanlder.sendEmptyMessage(2);

}
 return results;

}
@Override
 public void onItemClick(AdapterView<?> parent, View view,
      int position, long id) {
data.proj=F_DOWN[position];
 data.table=F_ID[position];
 data.flatname=F_NAME[position];

Intent newActivity = new Intent(view.getContext(),homescreen.class);     
    startActivity(newActivity);
  }


  private class MyTask extends AsyncTask
{

        Dialog dialog;

        @Override
        protected void onPreExecute() {
            // TODO Auto-generated method stub
            super.onPreExecute();
            dialog = new Dialog(yourclass.this);
            dialog.setTitle("Please wait");
            TextView tv = new TextView(yourclass.this.getApplicationContext());
            tv.setText("Loading...");
            dialog.setContentView(tv);
            dialog.show();
        }

        @Override
        protected Object doInBackground(Object... params)
        {
                    GetSearchResults();


        }

        @Override
        protected void onPostExecute(Object result) {
            // TODO Auto-generated method stub
            super.onPostExecute(result);
            if(dialog.isShowing())
                dialog.cancel();
                lv1 = (ListView) findViewById(R.id.listV_main);
                     adb=new ItemListBaseAdapter(Ongoing.this, results);
                     lv1.setAdapter(adb);
            Toast.makeText(getApplicationContext(), "Loaded Succesfully", Toast.LENGTH_LONG).show();


        }

    }


  }

暫無
暫無

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

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