0

我的活动使用线程工作正常,但是当有 10 个或更多图像要从 Web 服务器数据库中获取时,它需要很多时间。通过谷歌搜索,我看到 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);
 }}
4

3 回答 3

1

检查这个我用 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();


        }

    }


  }
于 2012-11-28T07:08:55.757 回答
1

您只需将GetSearchResults();todoInBackGround和 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();
}
于 2012-11-28T07:02:32.127 回答
1

参考这些链接!-

1)实现 AsyncTask 的技巧

2)处理程序 vs AsyncTask vs 线程

3) AsyncTask Android 示例

希望能帮助到你。

于 2012-11-28T07:02:50.203 回答