在后台线程上执行Android网络操作

时间:2017-11-25 00:20:12

标签: java android multithreading handler

目前我使用的是运行3秒钟的Android操作系统处理程序。问题是我不知道网络操作实际需要多长时间。有没有办法在只删除200条消息时停止进度对话框?

处理程序:

new android.os.Handler().postDelayed(
                        () -> {
                            // On complete call delete contact method
                            deleteAllMsgs(progressDialog);
                            // onLoginFailed();
                        }, 3000);

方式:

private void deleteAllMsgs(ProgressDialog progressDialog) {
        ParseQuery<ParseObject> msgQuery= new ParseQuery<>(ParseConstants.CLASS_MESSAGE);
        // Query the Comment class for comments that have a "author" column value equal to the objectId of the current User
        msgQuery.whereEqualTo((ParseConstants.KEY_SENDER_AUTHOR_POINTER), ParseUser.msgQuery());
        yeetQuery.setLimit(200);
        msgQuery.findInBackground((messages, e) -> {
            if (e == null) {
                // Iterate over all messages
                for (ParseObject delete : messages) {

                    // Delete messages from local data store
                    try {
                        delete.unpin();
                    } catch (ParseException e1) {
                        e1.printStackTrace();
                    }

                    // Delete messages from Parse
                    delete.deleteInBackground();

                }

                // Return to main screen
                Toast.makeText(getApplicationContext(), "200 messages deleted", Toast.LENGTH_SHORT).show();
                finish();


            } else {
                Log.e("Error", e.getMessage());
            }
        });
    }

3 个答案:

答案 0 :(得分:1)

SELECT COUNT(DISTINCT e.products_id)
FROM product_eans e
inner join products p on e.products_id = p.id
WHERE e.ean LIKE '%4788%'
OR p.name LIKE '%4788%'

您可以在asynctask方法中尽可能多地使用runOnUiThread方法。有了这个,您可以发送toast消息,设置textview的文本等...

答案 1 :(得分:1)

您必须使用Asynch任务方法,而不是使用OS处理程序,在此处引用https://www.concretepage.com/android/android-asynctask-example-with-progress-bar

这里不一定要使用&#34; progressUpdate()&#34;,如果不这样做,你也可以这样做。

所以你可以将progressdialog初始化为&#34; preExecute()&#34;,

然后把你的&#34; deleteAllMessage()&#34;在doInBackguound()和

任务完成后,它会自动跳转到&#34; postExecute()&#34;。

所以你可以停止显示进度条。致电:

    progressdialog.stop()

答案 2 :(得分:1)

  

只有在删除了200条消息后才能停止进度对话框吗?

是的,您需要正确使用Parse的回调。

在for循环之后立即将消息删除后的代码放在上而不是回调之外

对于ParseQuery.findInBackground或者deleteInBackground,你不需要Handler或Asynctask

此外,您应该使用带有回调的public class MissingIdentifier { protected String Identifier; protected Date from; protected Date to; @Override public String toString() { return Identifier + from + to; } @Override public boolean equals(MissingIdentifier other) { if (this.toString == other.toString) return true; return false; } 来了解何时删除对象列表而不必先找到它们