2016-05-10 7 views
0

私は問題を抱えており、解決策のための場所(youtube、devサイト)の全体を見て、見つけられませんでした。Android:非同期タスク|バックグラウンドでUIがフリーズしますか?

私のアプリケーションのUIは、ボレーの接続が開始されたときにハングしています。私はそれをDoInBackgroundメソッドをオーバーライドするAsyncTaskに追加しましたが、まだハングします。

私はボレーを通じて接続を処理しているコードは次のとおりです。

public class DoInBackground extends AsyncTask<String, Void, String> { 
    @Override 
    protected String doInBackground(String... arg0) { 
     //Adding cameras from server using volley... 
     String url = "FullUrlHere"; 
     JSONArray jArray = new JSONArray(); 

     JsonArrayRequest jArrayReq = new JsonArrayRequest(url, new Response.Listener<JSONArray>() { 
      @Override 
      public void onResponse(JSONArray response) { 
       //Response received 
       try { 
        int sizeOfArray = response.getInt(0); 
        String element = response.getString(1); 

        //Toast.makeText(getApplicationContext(), "Size: " + sizeOfArray, Toast.LENGTH_LONG).show(); 
        //Now we have the size of array, now to cycle through them 
        for (int i = 1; i < sizeOfArray + 1; i++) { 
         //Cycle through 
         String nextAddress = response.getString(i); 
         //Put into our array 
         cameraAddresses.add(nextAddress); 
        } 

        for (String address : cameraAddresses) { 
         String camAddress = address; 
         //Toast.makeText(getApplicationContext(), latitudeValue, Toast.LENGTH_LONG).show(); 

         //Start reverse geo coding. (Turning address into coordinates.) 
         Geocoder camLocationGeocoder = new Geocoder(getApplicationContext()); 
         List<Address> addresses; 
         addresses = camLocationGeocoder.getFromLocationName(address, 1); 
         if (addresses.size() > 0) { 
          double latitude = addresses.get(0).getLatitude(); 
          double longitude = addresses.get(0).getLongitude(); 
          //Add markers. 
          Marker camera = mMap.addMarker(new MarkerOptions().position(new LatLng(latitude, longitude)).title("Possible Speed Camera.").icon(BitmapDescriptorFactory.fromResource(R.drawable.camera_placemarker))); 
          cameraList.add(camera); 
         } 

        } 
       } catch (Exception e) { 
        //Error caught. 
        //Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_LONG).show(); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       //Error 
       //Toast.makeText(getApplicationContext(), error.toString(), Toast.LENGTH_LONG).show(); 
      } 
     }); 

     MySingleton.getInstance(getApplicationContext()).addToRequestQueue(jArrayReq); 
     return null; 
    } 
} 


private void addLocations() { 
    //Below code to be performed on BG thread 

    for (Marker camera : cameraList) { 
     camera.remove(); //Remove camera, we will re-add them in a while. 
    } 
    cameraList.clear(); //Remove all cameras from arrayList 

    //Execute Task 
    new DoInBackground().execute(); 
} 
+0

私は凍結していませんが、doInBackground()はマップがUIスレッドで定義されており、別のスレッドからマーカーを追加しようとしているためマーカーをマップに追加できません。 catch()を空のままにしてはいけません。何が例外であるかを表示してください。 –

答えて

0

行い、バックグラウンドでのUIをフリーズ?

doInBackground名前がseapare、UIスレッドなしで実行されていることを示します。 UIスレッドをブロックすることはありません(ただし、UIスレッドにも影響する重い負荷がかかる可能性がありますが、他のストーリー)。

+0

しかし、あなたは質問に答えていません。 :/ UIスレッドをブロックすることは想定されていませんが、その理由はわかりません。 –

+0

私は 'Do in background in UI? 'という質問に答えました。また、「フリーズ」とはここでは何も意味がなく、あまりにも一般的です。問題を引き起こすのはカメラの取り外しループではないことをどうお知りになりますか?他の方法でプロフィールやチェックをしましたか? –

+0

カメラ取り外しループをdoInBackgroundに追加し、1秒間表示します。私はテスト中にループ内に2つしかないので、UIをフリーズするべきではないことに注意してください。しかし私に見せてください。 –

0

onPostExecuteまたはonProgressUpdateを無効にしようとしましたか? - >doInBacground()

  • doInBackground(Object[] params)呼ばれる前にメインスレッドで実行 - >バックグラウンドで実行され、UI
  • onProgressUpdate(Object[] values)と対話することはできません - >メインで実行

    • onPreExecute()

      AsyncTaskは、4つのメソッドを持っていますスレッドを呼び出すときpublishProgress(Object... values)doInBackground

    • onPostExecute(Object result) - >doInBackgroundあなたがカメラを作成するために使用されている方法は、メインスレッドで実行する必要がありますが、ヤウドはまだ問題が解決しなかった場合、あなたはインスタンスに新しいを試すことができた場合、タスク

    イムはわからない終了しますカメラをonProgressUpdateに追加し、カメラを作成するデータがあるたびにpublishProgressdoInBackgroundから呼び出します。

    私はそれがあなたを助けてくれることを願っています。

  • 関連する問題