1

我有一个我不明白的问题。我想在 Android 中显示一个简单的进度对话框。所以我创建了一个AsyncTask并在构造函数中创建了对话框。我使用onPreExceution对话initialiseonPostExecute方法和破坏对话的方法。所以到目前为止,这对我来说看起来完全正确。但是当我在我的 Nexus 7 上启动应用程序时,对话框不会出现,直到工作完成。所以它在工作结束时出现半秒......我做错了什么?

感谢您的帮助 ;)

public class ParseHTMLCodeNew extends AsyncTask<String, Void, String> {
    ProgressDialog dialog;

    public ParseHTMLCodeNew(Context context) {
        dialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {
        //einrichten des Wartedialogs
        dialog.setTitle("Bitte warten!");
        dialog.setMessage("Die Kommentare werden vom Server geladen.");
        dialog.show();
    }

    @Override
    protected String doInBackground(String params) {
        InputStream is = null;
        String data = "";
        try
        {
            URL url = new URL( params[0] ); 
            is = url.openStream(); 
            data = new Scanner(is).useDelimiter("//html//").next(); 
        } 
        catch ( Exception e ) { 
            e.printStackTrace(); 
        } 
        return data;
    }

    @Override
    protected void onPostExecute(String result) {       
        //Dialog beenden RSS Feed ist fertig  geparst
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
        }        
    }
}

更新

这是我的新异步任务:

public class ParseHTMLCodeNew extends AsyncTask<String, String, String> {
ProgressDialog dialog;
private final OnCompleteTaskListener onCompleteTaskListener;

public interface OnCompleteTaskListener {
        void onComplete(String data);
}

public ParseHTMLCodeNew(Context context, OnCompleteTaskListener taskListener) {
    onCompleteTaskListener = taskListener;
    dialog = new ProgressDialog(context);
}


@Override
protected void onPreExecute() {

    //einrichten des Wartedialogs
    dialog.setTitle("Bitte warten!");
    dialog.setMessage("Die Kommentare werden vom Server geladen.");
    dialog.show();

}

@Override
protected String doInBackground(String... params) {
    InputStream is = null; 
    String data = "";
    try 
    { 
      URL url = new URL( params[0] ); 
      is = url.openStream(); 
      data = new Scanner(is).useDelimiter("//html//").next(); 
    } 
    catch ( Exception e ) { 
      e.printStackTrace(); 
    } 
    return data;
}

@Override
protected void onPostExecute(String result){

  onCompleteTaskListener.onComplete(result);

  //Dialog beenden RSS Feed ist fertig  geparst
  if (dialog != null && dialog.isShowing()) {
      dialog.dismiss();
  }




}
}

我这样称呼它:

new ParseHTMLCodeNew(this,new OnCompleteTaskListener() {

        @Override
        public void onComplete(String data) {
            gData = data;

        }
    }).execute(url);

正如我在您的帖子中评论的那样,data没有任何价值。

4

3 回答 3

0

我编写了一个从在线数据库获取数据并在 lisview 中填充数据的代码,这是我代码的一部分,希望对您有所帮助!

class LoadMyData extends AsyncTask<String, String, String> {
        //Before starting background thread Show Progress Dialog

        protected void onPreExecute() {
            super.onPreExecute();
            pDialog = new ProgressDialog(getParent());
            pDialog.setMessage("Loading. Please wait...");
            pDialog.setIndeterminate(false);
            pDialog.setCancelable(false);
            pDialog.show();
        }


        protected String doInBackground(String... args) {

                    //Your code here 

            return null;
        }

        /**
         * After completing background task Dismiss the progress dialog
         * **/
        protected void onPostExecute(String file_url) {
            // dismiss the dialog after getting the data
            pDialog.dismiss();
            // updating UI from Background Thread
            runOnUiThread(new Runnable() {
                public void run() {
                    // In my case use my adapter to display the data in a listview 


                    adapter = new MyAdaper();
                    list.setAdapter(adapter);
                }
            });
        }
    }
于 2012-12-08T17:03:05.653 回答
0

进度对话框应从 UI 线程显示

 runOnUiThread(new Runnable() {
            public void run() {
dialog.setTitle("Bitte warten!");
dialog.setMessage("Die Kommentare werden vom Server geladen.");
dialog.show();
}});
于 2012-12-08T17:43:21.343 回答
0

如果您这样调用此代码:

String data = new ParseHTMLCodeNew(CommentActivity.this).execute(url).get();

然后你并没有真正看到你的对话,因为有一个阻塞的 UI。如果需要,方法 get() 等待计算完成,然后检索其结果。

这样调用:

new ParseHTMLCodeNew(CommentActivity.this).execute(url);

并且工作的结果直接在 AsyncTask 中处理。

如果你需要将数据传输到主线程,你应该告诉他任务已经完成。Wat是简单的代码,我只是添加了OnCompleteTaskListener接口

public class ParseHTMLCodeNew extends AsyncTask<String, Void, String> {

    private final OnCompleteTaskListener onCompleteTaskListener;
    private ProgressDialog dialog;

    public interface OnCompleteTaskListener {
        void onComplete(String data);
    }

    public ParseHTMLCodeNew(Context context, OnCompleteTaskListener taskListener) {
        onCompleteTaskListener = taskListener;
        dialog = new ProgressDialog(context);
    }

    @Override
    protected void onPreExecute() {

        // einrichten des Wartedialogs
        dialog.setTitle("Bitte warten!");
        dialog.setMessage("Die Kommentare werden vom Server geladen.");
        dialog.show();

    }

    @Override
    protected String doInBackground(String... params) {
        StringBuilder sb = new StringBuilder();

        // your code here
        try {
            for (int i = 0; i < 100; i++) {
                Thread.sleep(100);
                sb.append(i);
            }

        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        return sb.toString();
    }

    @Override
    protected void onPostExecute(String result) {

        // Dialog beenden RSS Feed ist fertig geparst
        if (dialog != null && dialog.isShowing()) {
            dialog.dismiss();
        }

        onCompleteTaskListener.onComplete(result);
    }
}

还有一个电话的例子

new ParseHTMLCodeNew(this,new OnCompleteTaskListener() {

            @Override
            public void onComplete(String data) {
                Toast.makeText(CommentActivity.this, data, Toast.LENGTH_LONG).show();

            }
        }).execute("your_url");

请注意,当您旋转手机时,此代码可能会产生错误。当 Activity 销毁但执行任务时: - 进度对话框将关闭并且不会再次打开 - 对话框或上下文的局部变量不正确。

如果长时间执行操作是否可以通过服务?

于 2012-12-08T21:17:44.367 回答