2017-08-08 9 views
0

私は2つのクラスを持っています。 1つは私のSettingsActivityであり、私のvolleyが仕事をするクラスです。私のウェブサービスでは、それはArrayListに変換する必要がある多くのデータを持ち、私のDatabaseに保存されます。 2つ目のWebサービスが開始される前に、最初のWebサービスが開始された後に呼び出す2つのWebサービスがあり、1秒遅れて開始されます。これらの事の後、それは私のLogにそれは常に私のデータベースを使用した後に近く、それがすべて閉じられている場合、私はすでに確認し、次の回避方法アプリケーションがメインスレッドであまりにも多くの作業を行っている可能性があります

I/Choreographer: Skipped 226 frames! The application may be doing too much work on its main thread. 
V/RenderScript: 0x5595d9d0e0 Launching thread(s), CPUs 8 
W/art: Suspending all threads took: 20.500ms 
W/SQLiteConnectionPool: A SQLiteConnection object for database '/data/data/com.app.myapp/databases/myDB.sqlite' was leaked! Please fix your application to end transactions in progress properly and to close the database when it is no longer needed. 
I/art: Background partial concurrent mark sweep GC freed 38249(2025KB) AllocSpace objects, 2(968KB) LOS objects, 40% free, 16MB/26MB, paused 569us total 130.628ms 
I/Choreographer: Skipped 1528 frames! The application may be doing too much work on its main thread. 

を表示します。しかし、私はまだdatabase is leakedメッセージとSkipped xxx framesを持っています。私Volley

btnSync.setOnClickListener(new View.OnClickListener(){ 
     public void onClick(View v) { 

    Thread thread = new Thread(new Runnable(){ 
       @Override 
       public void run(){ 
        Parameter.parameterOneVolley(SettingsActivity.this, getApplicationContext()); 
       } 
      }); 
    } 
    }); 

などに classを呼び出すときに、私はすでにこれを試した後、私は Can't create handler inside thread that has not called Looper.prepare()

はその後もこの

runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        Parameter.parameterOneVolley(SettingsActivity.this, getApplicationContext()); 
       } 
      }); 
を使用してみまし遭遇し、私は私の SettingsActivityで私のクラスを呼び出し、新しいスレッドを作成しようとしました

しかし、これはメッセージSkipped framesを持っています。どのようにそれを解決するには?助けを借りてありがとうございました。

私のParamaterクラスでは、私もProgressDialogと呼んでいます。

は、ここで私は私がProgress Dialog and Toastを使用していますが、私はまだSkipped frames

に遭遇するたびに代わりProgressBarを使用してみました

activity.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        pd = new ProgressDialog(activity); 
      pd.setMessage("Fetching data...."); 
      pd.show(); 
     } 
       } 
      }); 

activity.runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        if(pd != null && pd.isShowing()) { 
         pd.dismiss(); 
        } 
        Toast.makeText(context, "Successfully synced.", Toast.LENGTH_SHORT).show(); 
       } 
      }); 

を追加しようとしたParamter.parameterOneVolley

public static void parameterOneVolley(final Activity activity, final Context context) { 

    final ProgressDialog pd = new ProgressDialog(activity); 
    pd.setMessage("Fetching data...."); 
    pd.show(); 

    initializeDatabase(context); 
    sqLiteAdapter = new SQLiteAdapter(activity); 

    regionList = new ArrayList<Region>(); 
    divisionList = new ArrayList<Division>(); 


    final Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() { 
     @Override 
     public void onResponse(JSONObject response) { 

      try { 

       JSONArray regionArr = response.getJSONArray("Region"); 
       JSONArray divisionArr = response.getJSONArray("Division"); 

       sqLiteAdapter.openToRead(); 



        for(int i = 0; i < regionArr.length(); i++){ 
         JSONObject regionObj = (JSONObject) regionArr.get(i); 
         Region region = new Region(regionObj.getInt("RegionId"),regionObj.getString("Region")); 

         regionList.add(region); 


        if(regionList.size()!=0) { 
         sqLiteAdapter.insertOrReplaceRegion(regionList); 
        } 
       } 


        for(int i = 0; i < divisionArr.length(); i++){ 
         JSONObject divisionObj = (JSONObject) divisionArr.get(i); 
         Division division = new Division(divisionObj.getInt("RegionId"),divisionObj.getInt("DivisionId"),divisionObj.getString("Division")); 

         divisionList.add(division); 


        if(divisionList.size()!=0) { sqLiteAdapter.insertOrReplaceDivision(divisionList); 
        } 
       } 

       sqLiteAdapter.close(); 

       if(pd != null && pd.isShowing()) { 
        pd.dismiss(); 
       } 

      } catch (JSONException e) { 
       e.printStackTrace(); 
       sqLiteAdapter.close(); 

       if(pd != null && pd.isShowing()) { 
        pd.dismiss(); 
       } 

       Toast.makeText(context, 
         e.getMessage(), Toast.LENGTH_SHORT).show(); 
      } 


      Toast.makeText(context, "Successfully synced.", Toast.LENGTH_SHORT).show(); 
        //call next web service 
        final Handler handler = new Handler(); 
        handler.postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          parameterTwoVolley(activity, context); 
        } 
        }, 1000); 

     } 
    }; 

    final Response.ErrorListener errorListener = new Response.ErrorListener() { 
     @Override 
     public void onErrorResponse(VolleyError error) { 
      if(pd != null && pd.isShowing()) { 
        pd.dismiss(); 
       } 

      if (error.networkResponse != null) { 
       Log.d(TAG, "Error Response code: " + error.networkResponse.statusCode); 
       Toast.makeText(context, error.networkResponse.statusCode, Toast.LENGTH_SHORT).show(); 
      } 
      if (error instanceof TimeoutError || error instanceof NoConnectionError) { 
       Log.d(TAG, "Error Response code: Timeout/NoConnection"); 
       Toast.makeText(context, "Timeout/NoConnection", Toast.LENGTH_SHORT).show(); 
      } else if (error instanceof AuthFailureError) { 
       Log.d(TAG, "Error Response code: AuthFailureError"); 
       Toast.makeText(context, "AuthFailureError", Toast.LENGTH_SHORT).show(); 
      } else if (error instanceof ServerError) { 
       Log.d(TAG, "Error Response code: ServerError"); 
       Toast.makeText(context, "ServerError", Toast.LENGTH_SHORT).show(); 
      } else if (error instanceof NetworkError) { 
       Log.d(TAG, "Error Response code: NetworkError"); 
       Toast.makeText(context, "NetworkError", Toast.LENGTH_SHORT).show(); 
      } else if (error instanceof ParseError) { 
       Log.d(TAG, "Error Response code: ParseError"); 
       Toast.makeText(context, "ParseError", Toast.LENGTH_SHORT).show(); 
      } 

      if(pd != null && pd.isShowing()) { 
       pd.dismiss(); 
      } 
     } 
    }; 
} 

のための私のコードですそれを表示して非表示にするそれでもなお発生しますskipped frames

+2

'Parameter.parameterOneVolley'メソッドを使って何をしているかによって異なります。 'runOnUiThread'のUI関連部分のみをラップしてください –

答えて

1

Androidでは、メインスレッド(UIスレッドとも呼ばれる)のみがビューを更新できます。これは、AndroidではUIツールキットがスレッドセーフではないためです。

ワーカースレッドからUIを更新しようとすると、Androidはこの例外をスローします。別のスレッドからUIを更新する場合は、Handlerを使用します。

final Handler handler=new Handler(); 
new Thread(new Runnable() { 
    @Override 
    public void run() { 
     //your code 
     handler.post(new Runnable() { 
      @Override 
      public void run() { 
       Parameter.parameterOneVolley(SettingsActivity.this, getApplicationContext()); 
      } 
     }); 
    } 
}).start(); 
+0

これを参考にするために、いくつかの説明を追加したいと思います... – GhostCat

+0

どこに置くべきですか?私のSettingsActivityに? – natsumiyu

+0

更新された回答 –

関連する問題

 関連する問題