我有一个应用程序在用户登录时进行API调用,我有两个类,一个推送到API,另一个推送它。我的LogIn Activity上还有一个 asyncTask
来处理网络连接。当网络连接开始时,我有一个视图switcher
来将视图切换到进度加载器和textview
,textview用于显示诸如" Connecting",&#34之类的内容;下载数据"等。
问题是我的API推送和拉取方法存储在不同的类中,而LogIn AsyncTask
只是调用它们,除了更新TextView
之外,它都有效用户知道进度。
在LogIn活动中,我有这个方法,它将textview
信息更改为传递给它的数字。
public void updateProgress(int i) {
switch (i) {
case 0:
loadInfo.setText(R.string.log_in_thread_Connecting);
break;
case 1:
loadInfo.setText(R.string.log_in_thread_Connected);
break;
case 2:
loadInfo.setText(R.string.log_in_Thread_Sending_Data);
break;
case 3:
loadInfo.setText(R.string.log_in_thread_Response);
break;
case 4:
loadInfo.setText(R.string.log_in_web_connecting);
break;
case 5:
loadInfo.setText(R.string.log_in_web_connected);
break;
case 6:
loadInfo.setText(R.string.log_in_web_user_data_download);
break;
case 7:
loadInfo.setText(R.string.log_in_web_user_data_downloaded);
break;
case 8:
loadInfo.setText(R.string.log_in_web_device_data_upload);
break;
}
}
如果我从LogIn Activity中的 AsyncTask
调用它,而不是从API类调用它,则此方法有效。
我找到了一个名为.runOnUiThread的方法,所以我尝试实现它。
private void publishProgress(final int i){
logInActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
logInActivity.updateProgress(i);
Log.d("UI THREAD","HIT");
}
});
}
这就是我想出来的,但它似乎没什么打击,我甚至都看不到Log post。
我在执行此操作时也遇到了错误,但是当我将 Looper.prepare();
添加到登录 AsyncTask
的AsyncTask
private class RegistrationWeb extends AsyncTask<Void,Void,Void>{
private static final String tag = "API_LogIn";
private String APIKey = null
@Override
protected void onPreExecute() {
super.onPreExecute();
viewFlipper.showNext();
APIKey = getAPIKey();
}
@Override
protected Void doInBackground(Void... voids) {
try{
Looper.prepare();
GetAPIData get = new GetAPIData();
URL url = new URL(API_Register_User+APIKey);
String response = get.GetData(url);
JSONArray jsonArray = new JSONArray(response);
JSONObject jsonObject = jsonArray.getJSONObject(0);
//If the user is accepted
if(jsonObject.getString("_Code").equals("0")){
PublishProgress(8);
PostAPIData post = new PostAPIData();
url = new URL(API_Register_Device);
response = post.PostData(url);
jsonArray = new JSONArray(response);
jsonObject = jsonArray.getJSONObject(0);
} else if(jsonObject.getString("_Code").equals("2")){
}
} catch (MalformedURLException e) {
Log.e(tag,e.toString());
} catch (JSONException e) {
Log.e(tag,e.toString());
} catch (IOException e) {
Log.e(tag,e.toString());
}
return null;
}
private void PublishProgress(final int i){
runOnUiThread(new Runnable() {
@Override
public void run() {
updateProgress(i);
}
});
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
}
}
答案 0 :(得分:1)
您无法直接访问资源中的string
,您必须先获取resources
才能使用其内容。您需要从getResources()
拨打Activity
,然后就可以获得您要找的string
。
YourActivity.context.getResources().getString(R.string.id_name);
覆盖onProgressUpdate()
,然后致电publishProgress()
public void publishProgress(Integer v) {
Message message = new Message();
message.what = v;
YourActivity.handler.sendMessage(message);
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
publishProgress(values[0);
}
在创建过程中将AsyncTask参数从Void
更改为Integer
class RegistrationWeb extends AsyncTask<Integer,Integer,Integer> {
}
在Activity
所在的TextView
所在的Handler
中,让TextView
收听来自外部类的消息,并在该处理程序中更新您的public static Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
//update your text view on the basis of msg.what
}
}
};
。< / p>
<强>活动:强>
TextView
注意:将您的
loadInfo
{{1}}设为静态