有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于多个作业的java单Android线程

我希望有一个通过HTTP请求加载或保存数据的应用程序,但是数据必须与UI线程交互。理想情况下,我希望单个线程在消息上使用IF语句来确定请求是“加载”还是“保存”

用最少的代码量做这件事最简单的方法是什么

另外,处理程序实例是否在单个线程上运行

编辑:这是我现在使用的代码:

Handler doStuff = new Handler(){
        @Override
        public void handleMessage(Message msg){
            if(msg.what == 1){
                // Load all the information.
                // Get the ID from sharedPrefs
                SharedPreferences details= getSharedPreferences("details", 0);
                String ID = patDetails.getString("id", "error");
                // Load up the ID from HTTP
                String patInfo = httpInc.getURLContent("info.php?no="+AES.encrypt("387gk3hjbo8sgslksjho87s", ID));
                // Separate all the details
                patientInfo = patInfo.split("~");
            }
            if(msg.what == 2){
                // Save the data
            }
        }
    };

Eclipse停止调试并显示StrictMode的“未找到源”。阶级

我想这是因为它使用主线程访问internet,尽管它是在单个线程中运行的

任何想法


共 (2) 个答案

  1. # 1 楼答案

    Handlers不在单个线程上运行。检查那个链接。您还应该签出AsyncTask

  2. # 2 楼答案

    我建议将作业作为Runnable提交给单线程^{}

    public class SomeClass {
      private ExecutorService execService = Executors.newSingleThreadExecutor();
    
      public void doSomething() {
        final String someUiData = // retrieve data from UI
    
        execService.submit(new Runnable() {
    
          @Override
          public void run() {
            // so something time-consuming, which will be executed asynchronously from the UI thread
            // you can also access someUiData here...
          }
        });
      }
    }
    

    这样,UI线程将不会阻塞,而您可以轻松地为不同的操作提交不同的Runnable,并且ExecutorService将完全负责保持它的异步

    编辑:如果需要与UI交互,请在变为异步之前进行,并将结果保留在最终变量中