2016-12-01 52 views
-1

我使用OkHttpClient獲取職員列表(以JSON的形式)作爲響應使用AsyncTask函數。在獲得AsyncTask函數中的響應後,在將數據庫中的人員列表插入時,我想在屏幕上顯示計數。但它會產生以下錯誤。我嘗試了很多解決方案,但無法解決。ResourcesNotFoundException:字符串資源ID#0x0(沒有響應:UI線程)

以下是synchronizeStaffList活動使用處理程序調用SenkronizeEt Funtion。 公共類synchronizeStaffList擴展AppCompatActivity {

DatabaseHelper gksDatabase; 

TextView txtrecordValue; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_synchronize_staff_list); 


    gksDatabase = new DatabaseHelper(this); 
    txtrecordValue = (TextView) findViewById(R.id.txtrecordValue); 

    final Handler handler = new Handler(); 
    handler.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      //Do something after 100ms 
      SenkronizeEt(); 
     } 
    }, 500); 

    final Handler handler2 = new Handler(); 
    handler2.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      //Do something after 100ms 
      AlertDialog.Builder builder; 
      builder = new AlertDialog.Builder(synchronizeStaffList.this); 
      builder.setCancelable(false); 
      if (progressStaffListInfo == 0) { 
       builder.setMessage("Sunucu ile iletişim yok"); 
      } else if (progressStaffListInfo == 1) { 
       builder.setMessage("Sicil/Personel listesi güncellendi"); 
      } 
      builder.setPositiveButton("Tamam", new DialogInterface.OnClickListener() { 
       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        // if user pressed "MINIMIZE", cancel this dialog & minimize the application 
        // while attendance process will keep working in the back 
        // finish(); 
        startActivity(new Intent(synchronizeStaffList.this, synchronize.class)); 
        finish(); 
       } 
      }); 
      AlertDialog alert = builder.create(); 
      alert.show(); 
     } 
    }, 5000); 
} 

我使用第二處理程序顯示一個alertbox。

SenkronizeEt函數調用OkHttpHandlerAsyncTask函數來得到okHttpResponse/result 公衆詮釋progressStaffListInfo = 0; // 0:列表中沒有更新,1:列表更新,

private void SenkronizeEt() { 
    progressStaffListInfo = 0; 

    // Updating Staff List in device by calling webservices 
    HashMap<String, String> Parametre = gksDatabase.GetParameter(); 
    final String urlStaffList = "http://127.0.0.1:8080/JAXRSJsonCRUDExample/rest/employees/" + Parametre.get("DeviceNo"); 

    OkHttpHandler handler = new OkHttpHandler(); 

    String jsonEmployeesList = null; 
    try { 
     jsonEmployeesList = handler.execute(urlStaffList).get(); 
    } catch (Exception e) { 
     //tv.setText("sorry, something went wrong !"); 
    } 


    if (progressStaffListInfo == 0) { 
     Toast.makeText(synchronizeStaffList.this, "List Not Updated", Toast.LENGTH_SHORT).show(); 
    } else if (progressStaffListInfo == 1) { 
     Toast.makeText(synchronizeStaffList.this, "List updated in database", Toast.LENGTH_SHORT).show(); 
    } 
} 

這裏是OkHttpHandlerAsyncTask函數調用URL獲得響應,然後在數據庫中更新。

public class OkHttpHandler extends AsyncTask<String, Integer, String> { 

    OkHttpClient client = new OkHttpClient(); 

    @Override 
    protected String doInBackground(String... params) { 

     Request.Builder builder = new Request.Builder(); 
     builder.url(params[0]); 
     Request request = builder.build(); 

     try { 
      Response response = client.newCall(request).execute(); 
      // return response.body().string(); 
      String jsonData = response.body().string(); 
      //JSONObject Jobject = new JSONObject(jsonData); 
      //JSONArray Jarray = Jobject.getJSONArray("employees"); 
      JSONArray Jarray = new JSONArray(jsonData); 

      //get the length of the json array 
      int limit = Jarray.length(); 

      if (limit != 0) { 
       gksDatabase.PersonsDelete(); 
       progressStaffListInfo = 1; // Staff List updated 

      } 

      for (int i = 0; i < limit; i++) { 
       JSONObject object = Jarray.getJSONObject(i); 

       //store the data into database 
       // SId:StaffID SNo:StaffNumber  SN:StaffName CNo:CardNumber 
       gksDatabase.PersonsSave(Integer.parseInt(object.getString("sid")), object.getString("sno"), object.getString("sn"), 
         object.getString("cno") 
       ); 
       publishProgress((int) (((i+1)/(float) limit) * 100)); 
      } 

      return jsonData; 
     } catch (JSONException e) { 
      progressStaffListInfo = 0; 
     } catch (Exception e) { 
      e.printStackTrace(); 
      progressStaffListInfo = 0; 
     } 
     return null; 
    } 

    @Override 
    protected void onProgressUpdate(Integer... progress) { 
     setProgressPercent(progress[0]); 
    } 
} 

private void setProgressPercent(int progValue){ 
    txtrecordValue.setText(progValue); 
} 

在上述AsyncTask功能,當它嘗試顯示插在數據庫中的條目的計它給錯誤。其實,不僅如此。如果我在不同的線程上設置了任何東西(如進度條或計數),即使此時它會停止,直到asyncTask完成其工作。作爲示例,AlertDialog處理程序也在AsyncTask函數完成其所有工作時啓動。

以下是日誌:

E/AndroidRuntime: FATAL EXCEPTION: main android.content.res.Resources$NotFoundException: String resource ID #0x0 
at android.content.res.Resources.getText(Resources.java:249) 
at android.support.v7.widget.ResourcesWrapper.getText(ResourcesWrapper.java:52) 
at android.widget.TextView.setText(TextView.java:3796) 
at com.emiturk.gsk.synchronizeStaffList.setProgressPercent(synchronizeStaffList.java:172) 
at com.emiturk.gsk.synchronizeStaffList.access$100(synchronizeStaffList.java:25) 
at com.emiturk.gsk.synchronizeStaffList$OkHttpHandler.onProgressUpdate(synchronizeStaffList.java:167) 
at com.emiturk.gsk.synchronizeStaffList$OkHttpHandler.onProgressUpdate(synchronizeStaffList.java:116) 
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:647) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:137) 
at android.app.ActivityThread.main(ActivityThread.java:4810) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:511) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556) 
at dalvik.system.NativeStart.main(Native Method 

請幫助我。

+2

下面的答案是一個緊的,但我更喜歡String.valueOf(progValue); –

+0

@NikMyers你的方式是正確的,但它只是一個額外的代碼,嘗試閱讀本文http://stackoverflow.com/questions/9159358/implicit-cast-to-string-tostring-and-int –

+0

@PavneetSingh恕我直言它是更有吸引力的眼睛 –

回答

1

您不能設置TextView的int值,所以它應該是一個String對象,以便做到像

private void setProgressPercent(int progValue){ 
    txtrecordValue.setText(""+progValue); 
} 

""+將隱含您progValue轉換爲String彷彿第一個參數是一個字符串(這是空字符串"")隨着+然後其他將被提升爲字符串

+0

該錯誤已被刪除,但它不會在屏幕上顯示TextView,因爲它的可見性不是INVISIBLE或GONE。我的代碼的主要問題是,一旦asyctask函數啓動,就會停止進度條或任何事情。並在完成後恢復每件事情。 爲了更加清晰,請仔細閱讀上面寫的文本LOGs – Jawad

+0

@Jawad爲什麼要凍結,因爲你在500毫秒內首先使用延遲和'handler',第二個處理程序調用將在'5000'毫秒後執行,因此解決方案只是簡單地使用'post '而不是'postDelayed'用於第一個處理程序調用和alterdialog,您不必在某個線程上執行對話框,只需將您的警告對話框代碼放在某個函數中,然後從'onPostExecute'調用該函數,onPostExecute就是asyncTaks的一部分覆蓋它 –

+0

@Jawad和關於textview的可見性,這是​​你的xml問題,只需在'setProgressPercent'方法內部放置一個日誌或者toast,這樣它就會被調用或者不被調用,如果yes意味着問題是XML,如果你的asyncTask沒有意義問題 –

相關問題