【问题标题】:Loop wait for intent result (Java Android)循环等待意图结果(Java Android)
【发布时间】:2014-03-10 00:15:54
【问题描述】:

我真的真的很陌生,所以不要笑得太厉害......或者说得太神秘...... 我已经搜索,实验和搜索等......我正在学习,但我也越来越困惑!

我需要遍历 sdcard 上的一个文件夹,并通过 android 意图一个一个地发送该文件夹中任何 .html 文件的每个实例,一旦每个实例都被另一个 android 应用程序成功处理/打印。 Let's Print Droid(用于网络连接打印机的出色打印应用程序)。 这个应用程序只能接受一个文件,处理该文件渲染它等然后将它发送到打印机,然后它通过意图发送回结果好坏!

我尝试了各种睡眠选项(我知道这是不好的做法!)并等待并通知(我相信更好?)但我无法让它打印比它找到的第一个文件或最后一个文件更多的内容(取决于我的代码! )

以下是我的代码的一个版本。这个版本通过“Lets Print Driod”应用程序发送它处理的第一个文件,然后通过显示我的 Toast 消息“Waiting loop number -->”继续循环。

一旦在我的循环中收到意图结果,谁能告诉我使用等待和通知的正确方法吗?

非常感谢您的帮助。

package com.my.test;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.Menu;
import android.widget.Toast;

public class MainActivity extends Activity {
    String received_results_from_LPD = "YES";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        try {
            print_all_html();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
    }


    public synchronized void print_all_html() throws InterruptedException {
        received_results_from_LPD = "YES";

        for(int x = 1; x < 6; x = x+1) {
        if (received_results_from_LPD == "YES") {
        Intent i = new Intent(Intent.ACTION_VIEW);
        i.setClassName("com.blackspruce.lpd","com.blackspruce.lpd.WebPrint");
        i.setData( Uri.parse("file:///storage/emulated/0/Pictures/test" + x + ".html"));
        Toast.makeText(getApplicationContext(), "Loop Position " + x, Toast.LENGTH_SHORT).show();
        Toast.makeText(getApplicationContext(), "Value of LPD " + received_results_from_LPD, Toast.LENGTH_SHORT).show();
        Toast.makeText(getApplicationContext(), "Printing " + "test" + x + ".html", Toast.LENGTH_SHORT).show();
        received_results_from_LPD = "NO"; //reset for next time
        startActivityForResult(i, 99);
        //wait();
        }
        else Toast.makeText(getApplicationContext(), "Waiting loop number --> " + x, Toast.LENGTH_SHORT).show();
        received_results_from_LPD = "NO";
        Thread.sleep(1000);
        }
    }



    @Override
    protected synchronized void onActivityResult(int requestCode, int resultCode, Intent data) {
                  // TODO Auto-generated method stub
                    super.onActivityResult(requestCode, resultCode, data);
    if (data != null && requestCode == 99 && resultCode == RESULT_OK) {
        //successful 
        Toast.makeText(getApplicationContext(), "Sucessfull", Toast.LENGTH_SHORT).show();
        received_results_from_LPD = "YES";
        //notify();
    }
    else {
        //not successful
        Toast.makeText(getApplicationContext(), "oopps!!!!", Toast.LENGTH_SHORT).show();
        received_results_from_LPD = "YES";
        //notify();
        }
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

某种修复它... bodged它?!?不完全是我希望的,但暂时打印,直到我更好地理解 Java!

【问题讨论】:

  • 好吧,你可以保留待处理文件列表,然后从 onActivityResult 发出下一个。
  • 本质上,你必须把你的循环翻过来——而不是循环“驱动”程序流,你需要一个循环来决定每次程序流通过事件方法进入你的代码时要做什么.

标签: java android


【解决方案1】:

您的代码并不“糟糕”,只是您不能像那样循环,因为启动活动没有阻塞。如果在 onActivityResult 中还有要处理的数据,我会放弃 for 并测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-08-04
    • 2020-07-17
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2020-10-21
    • 2021-10-30
    • 1970-01-01
    相关资源
    最近更新 更多