1

为了学习 Android,我正在编写一个小应用程序。我要做的第一件事是通过远程 API 登录。

我想在拨打电话时显示一个“加载”对话框(以防他用户使用移动互联网)。对此的研究表明了两种可能的方法。

一种是使用ProgressDialog和扩展Thread的私有类,另一种是使用扩展AsyncTask的私有类。

哪个最适合/更适合这项任务?

我曾尝试使用 ProgressDialog 版本,但正在苦苦挣扎。我已将发出 http 请求的函数放在扩展的 Thread run() 方法中,但不确定如何将响应数据 (JSON) 传递回我的活动中。

任何和所有的帮助都感激不尽。

4

2 回答 2

2

最好的方法是使用 aAsyncTask和 a ProgressDialog。您应该扩展AsyncTask并实现您需要的所有方法:

  • onPreExecute()- 在这里你初始化你的ProgressDialogshow()
  • doInBackground()- 在这里你做你的工作
  • onPostExecute()dismiss()-在这里你调用ProgressDialog隐藏它
  • (可选)onProgressUpdate()- 在这里你可以改变你的进度,ProgressDialog如果它是确定的

类中有一个get()方法AsyncTask可以让您检索工作的结果。AsyncTask您也可以在和调用之间实现接口Activity以返回结果。希望这可以帮助。

于 2012-07-13T14:20:07.557 回答
0

努力有回报 :) Egor 是对的,AsyncTask 是最好的方法。但是您必须知道 Activity 正在 UI 线程上工作,而线程不在。因此,共享事物的唯一方法是通过处理程序。这里有一个例子:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);         
    setContentView(R.layout.main);      
    progress = (ProgressBar) findViewById(R.id.progressBar1);       
    handler= new Handler();     
}

public void startProgress(View view) {
    // Do something long
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            for (int i = 0; i <= 10; i++) {
                final int value = i;
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        progress.setProgress(value);
                    }
                });
            }
        }
    };
    new Thread(runnable).start();
}
于 2012-07-13T14:30:17.500 回答