ResourcesNotFoundException:字符串资源ID#0x0(无响应:UI线程)

时间:2016-12-01 12:18:14

标签: android android-asynctask ui-thread okhttp

我使用OkHttpClient使用JSON函数获取员工列表(AsyncTask形式)作为回复。在AsyncTask功能获得响应后,在数据库中插入人员列表时,我想在屏幕上显示计数。但它给出了以下错误。我尝试了很多解决方案,但无法解决。

以下是使用处理程序调用 SenkronizeEt 功能的 synchronizeStaffList活动。     public class 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);
}

我使用第二个处理程序来显示警告框。

按照 SenkronizeEt 功能调用OkHttpHandler AsyncTask函数获取okHttpResponse/result     public int 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();
    }
}

以下是OkHttpHandler AsyncTask函数,它调用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

请帮助我。

1 个答案:

答案 0 :(得分:1)

您无法在textView上设置int值,因此它应该是String对象,所以就像

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

""+会隐式将您的progValue转换为String,就好像第一个参数是一个字符串(它是空字符串"")以及+然后其他将被提升为字符串