2016-12-01 4 views
-1

AsyncTask機能を使用してスタッフリスト(JSONフォーム)を取得するにはOkHttpClientを使用しています。 AsyncTask funtionで応答を得た後、スタッフリストをデータベースに挿入している間に、その数を画面に表示したいと思います。次のエラーが発生します。私は多くの解決策を試しましたが、解決できませんでした。ResourcesNotFoundException:文字列リソースID#0x0(応答なしUIスレッド)

後はハンドラを使用してSenkronizeEt目的球呼び出すsynchronizeStaffList活動です。 パブリッククラスsynchronizeStaffList私はalertboxを表示するために第2のハンドラを使用し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); 
} 

を拡張します。 okHttpResponse/result 公共int型progressStaffListInfo = 0を得るためにOkHttpHandlerAsyncTask関数を呼び出しSenkronizeEt機能後

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

は、応答を取得し、それをデータベースに更新するURLを呼び出しOkHttpHandlerAsyncTask機能です。 AsyncTask機能上記で

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が終了するまで停止します。例として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 IMHO it'sもっと魅力的なのは、 –

答えて

1

それはStringオブジェクトでなければなりませんので、あなたが最初のパラメータは、それが空の文字列の文字列(であるかのように

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

""+のようにそれを行うことは、暗黙的にStringにごprogValueを変換するのTextViewにint値を設定することはできません"")と一緒に+他は文字列に昇格されます

+0

エラーは削除されますが、可視性がINVISIBLEまたはGONEでない場合は、TextViewが画面に表示されません。私のコードの主な問題は、asyctask関数が起動するとプログレスバーやその他のものが停止することです。完了後にすべてのものを再開します。 上記のテキストを丁寧に読んでください。ログ – Jawad

+0

@ Jawad理由は、あなたが500ミリ秒間に 'handler'と一緒に遅延を使用していて、2回目のハンドラ呼び出しが' 5000'ミリ秒後に実行されるためです。 'の代わりに' postDelayed'の代わりに最初のハンドラ呼び出しとalterdialogのためにいくつかのスレッドでダイアログを実行する必要はなく、単に関数の中に警告ダイアログコードを置き、その関数を 'onPostExecute'から呼び出すだけで、onPostExecuteはasyncTaksの一部ですそれをオーバーライドする –

+0

@ Jawadとtextviewの可視性については、XMLに問題があります。setProgressPercentメソッドの中にログやトーストを入れて、呼び出されているかどうかを確認してください。もしあれば、asyncTask –

関連する問題