2017-08-08 126 views
0

的工作太多了,我有两个班。一个是我的SettingsActivity,另一个是我的volley。在我的Web服务中,它有很多数据,需要将其转换为ArrayList,并将其保存到我的Database;我有一个两个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。我已经尝试创建一个新的线程,我调用了class时调用我的课,我SettingsActivityVolley

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()); 
       } 
      }); 
    } 
    }); 

试图在这之后我遇到Can't create handler inside thread that has not called Looper.prepare()

然后也用这个

runOnUiThread(new Runnable() { 

       @Override 
       public void run() { 
        Parameter.parameterOneVolley(SettingsActivity.this, getApplicationContext()); 
       } 
      }); 
尝试

但是,这我有一个消息Skipped frames。如何解决它?提前感谢您的帮助。

在我Paramater类我还呼吁ProgressDialog

这里是我的代码为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(); 
      } 
     } 
    }; 
} 

我尝试添加

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(); 
       } 
      }); 
每次

我使用Progress Dialog and Toast但我仍然遇到Skipped frames

使用ProgressBar还试图代替并显示并隐藏它但仍然遇到skipped frames

+2

取决于你在做什么'Parameter.parameterOneVolley'方法。在'runOnUiThread'中只包裹UI相关的部分 –

回答

1

在Android中,只有主线程(也称为UI线程)可以更新的意见。这是因为在Android中,UI工具包不是线程安全的。

当您尝试从一个工作线程的Android更新UI引发此异常。如果您想从另一个线程使用处理程序更新UI。

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

我应该把它放在哪里?在我的设置活动? – natsumiyu

+0

看看更新后的回答 –

相关问题