【问题标题】:Show ProgressDialog Android显示 ProgressDialog Android
【发布时间】:2012-04-06 13:46:35
【问题描述】:

我有一个 EditText,它从用户那里获取一个字符串和一个 searchButton。 当点击 searchButton 时,它将搜索 XML 文件并显示在 ListView 中。

我能够从用户那里获取输入,搜索 XML 文件并在 ListView 中显示用户搜索的值。

我想要的是在单击 searchButton 后显示 ProgressDialog,例如“请等待...正在检索数据...”或类似的内容,并在显示数据时将其关闭。

public class Tab1Activity extends ListActivity {
private Button okButton;
private Button searchButton;
Toast toast;
String xml;

private TextView searchText;
private String searchTextString;
HashMap<String, String> o;
ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tab1);

    searchButton = (Button) findViewById(R.id.search_button);
    searchButton.setOnClickListener(new View.OnClickListener() {

        public void onClick(View v) {
            // TODO Auto-generated method stub
            System.out.print("hello");

            searchText = (TextView) findViewById(R.id.search_text);
            searchTextString = searchText.getText().toString();
            readXml(searchTextString);

        }
    });

}

private void readXml(String searchTextString1) {
    ArrayList<HashMap<String, String>> mylist = new ArrayList<HashMap<String, String>>();

    String xml = XMLfunctions.getXML();
            //Here XMLfunctions is class name which parse xml
    Document doc = XMLfunctions.XMLfromString(xml);

    int numResults = XMLfunctions.numResults(doc);

    if ((numResults <= 0)) {
        Toast.makeText(Tab1Activity.this, "Testing xmlparser",
                Toast.LENGTH_LONG).show();
        finish();
    }

    NodeList nodes = doc.getElementsByTagName("result");

    for (int i = 0; i < nodes.getLength(); i++) {
        HashMap<String, String> map = new HashMap<String, String>();

        Element e = (Element) nodes.item(i);
        String nameMapString = XMLfunctions.getValue(e, "name");



         if ( nameMapString.toLowerCase().indexOf(searchTextString1.toLowerCase()) != -1 )   // != -1 means string is present in the search string
            {
                map.put("id", XMLfunctions.getValue(e, "id"));
                map.put("name",  XMLfunctions.getValue(e, "name"));
                map.put("Score",  XMLfunctions.getValue(e, "score"));
                mylist.add(map);
            }
    }

    ListAdapter adapter = new SimpleAdapter(this, mylist,
            R.layout.parsexml, new String[] { "name", "Score" }, new int[] {
                    R.id.item_title, R.id.item_subtitle });

    setListAdapter(adapter);

    final ListView lv = getListView();
    lv.setTextFilterEnabled(true);
    lv.setOnItemClickListener(new OnItemClickListener() {
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            @SuppressWarnings("unchecked")
            HashMap<String, String> o = (HashMap<String, String>) lv
                    .getItemAtPosition(position);


                Toast.makeText(Tab1Activity.this,
                         "Name "+o.get("name")+"  Clicked", Toast.LENGTH_LONG)
                        .show();                

        }
    });
}

【问题讨论】:

标签: android multithreading progressdialog


【解决方案1】:

声明你的进度对话框:

ProgressDialog progress;

当您准备好启动进度对话框时:

progress = ProgressDialog.show(this, "dialog title",
    "dialog message", true);

完成后让它消失:

progress.dismiss();

这是给你的一个小线程示例:

// Note: declare ProgressDialog progress as a field in your class.

progress = ProgressDialog.show(this, "dialog title",
  "dialog message", true);

new Thread(new Runnable() {
  @Override
  public void run()
  {
    // do the thing that takes a long time

    runOnUiThread(new Runnable() {
      @Override
      public void run()
      {
        progress.dismiss();
      }
    });
  }
}).start();

【讨论】:

  • 我已经写了下面的代码但不起作用:'searchButton.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // TODO 自动生成的方法存根 System.out.print ("hello"); searchText = (TextView) findViewById(R.id.search_text); searchTextString = searchText.getText().toString(); progress.show(Tab1Activity.this, "对话框标题", "请稍等.. .loading"); readXml(searchTextString); progress.dismiss(); } });'
  • nup,正如你在上面看到的,它需要很短的时间,我也写了 readXML 方法。
  • 我想知道 readXML 是否运行得如此之快以至于您看不到进度对话框。如果你在网络上做的事情真的需要几秒钟——首先,你会在一个单独的线程中做这件事,但是你会看到进度对话框的全部效果。如果您最终添加了线程,请确保您在 UI 线程中使用了 showdismiss 进度对话框。
  • 但我认为它有足够的时间来显示progressDialog。当我点击 searchButton 大约需要 2-3 秒。
  • 你知道吗,这可能是因为readXML 不允许用户界面喘口气。你可能想把它放在它自己的线程中——或者使用简单的new Thread(...)(我更喜欢)或者AsyncTask,正如 Win Myo Htet 所建议的那样。
【解决方案2】:

我在我当前的一个项目中使用以下代码,我从互联网下载数据。这一切都在我的活动课程中。

// ---------------------------- START DownloadFileAsync // -----------------------//
class DownloadFileAsync extends AsyncTask<String, String, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // DIALOG_DOWNLOAD_PROGRESS is defined as 0 at start of class
        showDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

    @Override
    protected String doInBackground(String... urls) {
        try {
            String xmlUrl = urls[0];

            URL u = new URL(xmlUrl);
            HttpURLConnection c = (HttpURLConnection) u.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();

            int lengthOfFile = c.getContentLength();

            InputStream in = c.getInputStream();

            byte[] buffer = new byte[1024];
            int len1 = 0;
            long total = 0;

            while ((len1 = in.read(buffer)) > 0) {
                total += len1; // total = total + len1
                publishProgress("" + (int) ((total * 100) / lengthOfFile));
                xmlContent += buffer;
            }
        } catch (Exception e) {
            Log.d("Downloader", e.getMessage());
        }
        return null;
    }

    protected void onProgressUpdate(String... progress) {
        Log.d("ANDRO_ASYNC", progress[0]);
        mProgressDialog.setProgress(Integer.parseInt(progress[0]));
    }

    @Override
    protected void onPostExecute(String unused) {
        dismissDialog(DIALOG_DOWNLOAD_PROGRESS);
    }

}

@Override
protected Dialog onCreateDialog(int id) {
    switch (id) {
    case DIALOG_DOWNLOAD_PROGRESS:
        mProgressDialog = new ProgressDialog(this);
        mProgressDialog.setMessage("Retrieving latest announcements...");
        mProgressDialog.setIndeterminate(false);
        mProgressDialog.setMax(100);
        mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
        mProgressDialog.setCancelable(true);
        mProgressDialog.show();
        return mProgressDialog;
    default:
        return null;
    }

}

【讨论】:

  • 方向改变对我来说很好。我刚刚在 2.3.3 AVD 和我的 ICS 手机上进行了测试。
【解决方案3】:

在为进度条创建对象时,请检查以下内容。

这失败了:

dialog = new ProgressDialog(getApplicationContext());

虽然添加活动上下文有效..

dialog = new ProgressDialog(MainActivity.this);

【讨论】:

    【解决方案4】:

    您不应在主线程中执行资源密集型任务。它会使 UI 无响应,您将获得 ANR。看起来您将做资源密集型的工作并希望用户看到ProgressDialog。您可以查看http://developer.android.com/reference/android/os/AsyncTask.html 来执行资源密集型任务。它还向您展示了如何使用ProgressDialog

    【讨论】:

      【解决方案5】:

      我在我当前的一个项目中使用以下代码,我从互联网下载数据。这一切都在我的活动课程中。

      private class GetData extends AsyncTask<String, Void, JSONObject> {
      
              @Override
              protected void onPreExecute() {
                  super.onPreExecute();
      
                  progressDialog = ProgressDialog.show(Calendar.this,
                          "", "");
      
              }
      
              @Override
              protected JSONObject doInBackground(String... params) {
      
                  String response;
      
                  try {
      
                      HttpClient httpclient = new DefaultHttpClient();
      
                      HttpPost httppost = new HttpPost(url);
      
                      HttpResponse responce = httpclient.execute(httppost);
      
                      HttpEntity httpEntity = responce.getEntity();
      
                      response = EntityUtils.toString(httpEntity);
      
                      Log.d("response is", response);
      
                      return new JSONObject(response);
      
                  } catch (Exception ex) {
      
                      ex.printStackTrace();
      
                  }
      
                  return null;
              }
      
              @Override
              protected void onPostExecute(JSONObject result) 
              {
                  super.onPostExecute(result);
      
                  progressDialog.dismiss();
      
                  if(result != null)
                  {
                      try
                      {
                          JSONObject jobj = result.getJSONObject("result");
      
                          String status = jobj.getString("status");
      
                          if(status.equals("true"))
                          {
                              JSONArray array = jobj.getJSONArray("data");
      
                              for(int x = 0; x < array.length(); x++)
                              {
                                  HashMap<String, String> map = new HashMap<String, String>();
      
                                  map.put("name", array.getJSONObject(x).getString("name"));
      
                                  map.put("date", array.getJSONObject(x).getString("date"));
      
                                  map.put("description", array.getJSONObject(x).getString("description"));
      
                                  list.add(map);
                              }
      
                              CalendarAdapter adapter = new CalendarAdapter(Calendar.this, list);
      
                              list_of_calendar.setAdapter(adapter);
                          }
                      }
                      catch (Exception e) 
                      {
                          e.printStackTrace();
                      }
                  }
                  else
                  {
                      Toast.makeText(Calendar.this, "Network Problem", Toast.LENGTH_LONG).show();
                  }
              }
      
          }
      

      并在 OnCreate 方法中执行它,例如 new GetData().execute();

      Calendar 是我的 calendarActivity,我还创建了一个 CalendarAdapter 来将这些值设置为列表视图。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-31
        • 1970-01-01
        • 1970-01-01
        • 2012-07-20
        • 1970-01-01
        相关资源
        最近更新 更多