【问题标题】:Show the progress Dialog until load the data to List显示进度对话框,直到将数据加载到列表
【发布时间】:2013-04-12 09:14:36
【问题描述】:

我开发的应用程序将数据加载到 ArrayList 需要 2/3 秒。我想显示加载数据到 ArrayList 的进度。

我为此使用了 AsyncTask。我通过单击按钮执行此操作,当 ArrayList 完全加载时,它将通过 Intent 传递给下一个活动。

代码片段如下-

按钮的onClick -

showList.setOnClickListener(new View.OnClickListener() {
  @Override
    public void onClick(final View v) {

      if (session.isOpened()) {

         if (friendID.size() == 0 && friendName.size() == 0) {

        new Async().execute();
      }
    }
});

Ansyc Task 类如下 -

class Async extends AsyncTask<String, Integer, String> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();

        dialog.setTitle("Loading...");
        dialog.setIcon(R.drawable.ic_launcher);
        dialog.setMessage("Please wait for completion");
        dialog.setProgress(0);

        dialog.show();
    }

    @Override
    protected String doInBackground(String... params) {

        Request.executeMyFriendsRequestAsync(session,
            new Request.GraphUserListCallback() {

                            @Override
            public void onCompleted(List<GraphUser> users,
                            Response response) {

                 Iterator<GraphUser> iterator = users.iterator();
                 GraphUser graphUser = null;

                    friendID.clear();
                    friendName.clear();

                    while (iterator.hasNext()) {
                            if (iterator != null) {
                                graphUser = iterator.next();

                                Log.d("Friend Information ",
                                        " friend ID " + graphUser.getId()
                                                + " friend Name "
                                                + graphUser.getName());

                                friendID.add(graphUser.getId());
                                friendName.add(graphUser.getName());

                                publishProgress(friendID.size());

                                Log.d("Friend Information ", " friendID= "
                                        + friendID.size() + " friendName "
                                        + friendName.size());
                            }
                        }
                    }

                });

        dialog.dismiss();
        return "sucess";
    }

    @Override
    protected void onPostExecute(String result) {
        super.onPostExecute(result);

        Intent intent = new Intent(MainActivity.this, FriendsList.class);

        Log.d("Checking the size ", "ID " + friendID.size() + " UserName "
                + friendName.size());

        /*
         * Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT)
         * .show();
         */

        intent.putStringArrayListExtra("userID", friendID);
        intent.putStringArrayListExtra("userName", friendName);
        intent.putExtra("str", result);
        startActivity(intent);
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        dialog.setProgress(values[0]);
        //dialog.incrementProgressBy(values[0]);
        super.onProgressUpdate(values);
    }
}

Log Cat 中的错误 -

04-12 14:15:56.595: E/AndroidRuntime(15794): FATAL EXCEPTION: AsyncTask #2
04-12 14:15:56.595: E/AndroidRuntime(15794): **java.lang.RuntimeException: An error occured while executing doInBackground()**

04-12 14:15:56.595: E/AndroidRuntime(15794):    at android.os.AsyncTask$3.done(AsyncTask.java:200)

04-12 14:15:56.595: E/AndroidRuntime(15794):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:274)

04-12 14:15:56.595: E/AndroidRuntime(15794):    at java.util.concurrent.FutureTask.setException(FutureTask.java:125)

04-12 14:15:56.595: E/AndroidRuntime(15794):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:308)

04-12 14:15:56.595: E/AndroidRuntime(15794):    at java.util.concurrent.FutureTask.run(FutureTask.java:138)

04-12 14:15:56.595: E/AndroidRuntime(15794):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1088)

04-12 14:15:56.595: E/AndroidRuntime(15794):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:581)

04-12 14:15:56.595: E/AndroidRuntime(15794):    at java.lang.Thread.run(Thread.java:1019)
04-12 14:15:56.595: E/AndroidRuntime(15794): **Caused by: java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()**

【问题讨论】:

标签: android arraylist android-asynctask progressdialog


【解决方案1】:

2 分:

  1. 看起来您的Request.executeMyFriendsRequestAsync 是一个异步操作,因此您只需请求一些操作并快速从AsyncTask.doInBackground() 返回。因此,通过这样的设计,数据加载本身会在稍后发生,当 AsyncTask.doInBackground() 已经通过时。你需要开启一个sycn API,所以所有好友数据都在AsyncTask.doInBackground()中加载。

  2. AsyncTask.onPostExecute()内部调用dialog.dismiss();

【讨论】:

  • 感谢您的回复...!但是请您详细说明您的答案吗?我无法在我的代码中进行更改...再次提前谢谢
猜你喜欢
  • 2013-04-22
  • 1970-01-01
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多