2016-12-01 1 views
-1

J'utilise OkHttpClient pour obtenir la liste de personnel (dans le formulaire JSON) en tant que réponse en utilisant AsyncTask Fonction. Après avoir obtenu la réponse dans AsyncTask funtion, tout en insérant la liste du personnel dans la base de données, je veux montrer le compte à l'écran. mais il donne l'erreur suivante. J'ai essayé beaucoup de solutions, mais je n'ai pas pu résoudre.ResourcesNotFoundException: ID de ressource de chaîne # 0x0 (aucune réponse: thread d'interface utilisateur)

ci-après le synchronizeStaffList Activité qui appelle SenkronizeEt Funtion utilisant gestionnaire. synchronizeStaffList public class étend 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); 
} 

J'utilise deuxième gestionnaire pour afficher un Alertbox.

Après la SenkronizeEt Fonction qui appel OkHttpHandler fonction AsyncTask pour obtenir le okHttpResponse/result public int progressStaffListInfo = 0; // 0: Liste non mise à jour, 1: Liste mise à jour,

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

Voici la fonction OkHttpHandlerAsyncTask qui appellent la URL pour obtenir la réponse, puis le mettre à jour dans la base de données.

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

En fonction ci-dessus AsyncTask, il donne l'erreur quand il essaie d'afficher le nombre d'entrées insérées dans la base de données. En fait, non seulement cela. si je mets quelque chose (comme barre de progression ou compte) sur un fil différent, même alors il s'arrête jusqu'à ce que le asyncTask termine son travail. A titre d'exemple, le gestionnaire AlertDialog démarre également lorsque la fonction AsyncTask termine tous ses travaux.

Après sont les journaux:

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 

me aider gentiment.

+2

La réponse ci-dessous est serrée, mais je préférerais String.valueOf (progValue); –

+0

@NikMyers votre chemin est juste, mais ce sera juste un peu de code supplémentaire, essayez de lire ceci http://stackoverflow.com/questions/9159358/implicit-cast-to-string-tostring-and-int –

+0

@PavneetSingh IMHO c'est plus attrayant pour les yeux –

Répondre

1

Vous ne pouvez pas définir int valeur sur textView il devrait donc être un objet String donc faire comme

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

""+ va convertir implicitement votre progValue-String comme si le premier paramètre est une chaîne (ce qui est une chaîne vide "") avec + puis d'autres seront promus à la chaîne

+0

L'erreur est supprimée, mais elle n'affiche pas le TextView sur l'écran où sa visibilité n'est pas INVISIBLE ou GONE. Le principal problème avec mon code est qu'il arrête la barre de progression ou n'importe quoi une fois que la fonction asyctask démarre. et reprend tout après son achèvement. Pour plus de clarté, veuillez lire le texte écrit ci-dessus LOGs – Jawad

+0

@Jawad pourquoi geler parce que vous utilisez le retard avec 'gestionnaire 'd'abord pour 500 millisecondes et 2ème appel de gestionnaire sera exécuté après' 5000' millisecondes donc la solution est simplement utiliser 'post 'au lieu de' postDelayed' pour l'appel du premier gestionnaire et pour alterdialog, vous n'avez pas à exécuter un dialogue sur un thread, mettez simplement votre code de dialogue d'alerte dans une fonction et appelez cette fonction 'onPostExecute', onPostExecute fait partie de asyncTaks le contourner –

+0

@Jawad et à propos de la visibilité textview, c'est un problème avec votre XML, il suffit de mettre un journal ou un toast dans la méthode 'setProgressPercent' afin qu'il soit appelé ou non, si oui signifie que le problème est avec XML si aucun problème dans votre asyncTask –