【问题标题】:Server call from android activity来自 android 活动的服务器调用
【发布时间】:2015-05-30 22:25:51
【问题描述】:

我正在开发安卓应用。我需要从我的服务器获取数据。我正在从 acitivity 进行服务器调用并得到 java.lang.reflect.invocationtargetexception,因为我是在主 android 线程上进行的。为了解决这个问题,我只需创建一个新线程并调用 thread.join 即可完成。我想知道使用此类代码有什么副作用吗?我尝试使用处理程序和异步执行程序,但代码变得混乱。 会很感激帮助。谢谢!

   Runnable runnable=new Runnable() {

        @Override
        public void run() {
            // TODO Auto-generated method stub
            nearCars=getNearCars();
        }
    };
    Thread t=new Thread(runnable);
    t.start();
    try {
        t.join();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

【问题讨论】:

  • 查看 Android Volley 异步网络库!它非常强大!
  • 改用 OkHttp 或 Volley 等库。
  • loopJ 是我个人喜欢的另一个选项。这些库将在工作线程上执行网络调用并在主线程上返回响应。您可以通过接口和事件管理轻松纠正您的逻辑。
  • join() 将保留您的主 UI 线程,这不是一个好方法。而是使用AsyncTask
  • 看看这个SO question

标签: java android multithreading


【解决方案1】:

您可以在Android SDK 中使用AsyncTask 来完成这些操作。例如:

private class GetNearCarsAsyncTask extends AsyncTask<Void, Void, NearCarReturnType> {
     protected Long doInBackground(Void... arg) 
     {
          nearCars=getNearCars();
          return nearCars;
     }

     protected void onPostExecute(NearCarReturnType result) {
         // DO something on UI Thread
     }
 }

但是,如果您在 Google 上搜索“AsyncTask 的问题”等内容,AsyncTask 也存在一些陷阱和陷阱。因此,开发人员现在更喜欢使用像 loopj Async LibraryRetrofit 这样的 HTTP 库来避免常见的陷阱。

【讨论】:

  • 感谢阿迪尔的回复。不知道这些库。但是这种方法有什么缺点吗?运行时间有点短。使用这些库进行重构可能需要时间
  • 你现在绝对可以从 AsyncTask 开始。但是请记住,您可能会遇到生命周期问题,尤其是在轮换时。例如,您可能希望保留 AsyncTask 的活动级别实例,您可以在活动结束时取消该实例,或者如果您的活动在轮换时重新创建,则决定轮换时要做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 2011-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多