在我的活动中,我必须使用HttpPost
获得大的JSON~600KB。这需要一些时间来下载和分配内存,所以我在AsyncTask
中执行此操作。我有一个TextView
,只是在我的XML中加载:
<TextView
android:id="@+id/loader_tv"
android:text="@string/loading"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginTop="15dip"
android:layout_alignLeft="@id/shipid_tv"
android:layout_marginLeft="50dip"
android:layout_below="@id/shipid_tv"
android:textSize="18sp" />
当AsyncTask
完成其doInBackGround
后,在postExecute
中,我隐藏了加载TextView
loading.setVisibility(View.GONE);
这一切都很完美。
现在我注释了TextView
并添加了ProgressBar
:
<!-- TextView
android:id="@+id/loader_tv"
android:text="@string/loading"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_marginTop="15dip"
android:layout_alignLeft="@id/shipid_tv"
android:layout_marginLeft="50dip"
android:layout_below="@id/shipid_tv"
android:textSize="18sp" /-->
<ProgressBar
android:id="@+id/loading_pb"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:indeterminate="true"
android:indeterminateBehavior="repeat"/>
还有活动类:
//TextView loading;
ProgressBar loading;
在onCreate
:
//loading=(TextView)findViewById(R.id.loader_tv);
loading=(ProgressBar)findViewById(R.id.loading_pb);
并且loading.setVisibility(View.GONE);
行显然保持不变。
这样做会让我的程序变得混乱。
出现ProgressBar
,但JSON没有开始下载。如果我等待太久(约1分钟,它永远不会超过5秒)我得到连接超时的异常。它变得更加怪异,如果我在没有等待的情况下按下这么久,它会回到之前的活动并立即开始下载JSON。我不明白进度条如何影响我的代码的doInBackground
部分,我甚至没有在该函数中提到它。我反复评论了进度条并将textview放回去,反之亦然,只要它在textview上它工作正常,当它在进度条上时它不起作用。
我很难过,任何解决方案?
修改
我的doInBackGround如下:
protected JSONObject doInBackground(Void... params){
String s;
String keyval=intent_data;
String orgcode=MainActivity.un.getText().toString();
JSONObject jsonobj=null, shipmentcodesend=null;
try{
jsonobj=new JSONObject("someHeavyJson");
}
catch(JSONException je){
Log.e("ShipmentEventFindingActivity.EventFindAsyncTask","JSON error" , je);
ErrorDialog displayerror=new ErrorDialog(je, context);
displayerror.showDialog();
}
System.out.println("Made jsonobject");
System.out.println(jsonobj.toString());
JSONConnectorPost connector1=new JSONConnectorPost(jsonobj, getString(R.string.PIDsearch_url), MainActivity.cookieStore.getCookies());
JSONObject result=connector1.connectClient();
s=result.toString();
try{
String cacheID=result.getString("cacheId");
shipmentcodesend=new JSONObject("andMoreJson");
}
catch(JSONException je){
Log.e("ShipmentEventFindingActivity.EventFindAsyncTask","JSON error" , je);
ErrorDialog displayerror=new ErrorDialog(je, context);
displayerror.showDialog();
}
System.out.println("Made shipmentcodesend");
System.out.println(shipmentcodesend.toString());
JSONConnectorPost connector2=new JSONConnectorPost(shipmentcodesend, getString(R.string.PIDsearch_url),MainActivity.cookieStore.getCookies());
shipmentcodes=connector2.connectClient();
return result;
}
答案 0 :(得分:0)
你需要在AsyncTask中使用它:
private final ProgressBar progressBar;
private final TextView textView;
public LoadingTask(TextView textView, ProgressBar progressBar) {
this.progressBar = progressBar;
this.textView = textView;
}
@Override
protected Integer doInBackground(Integer... params) {
//Your post request
}
@Override
protected void onProgressUpdate(Integer... values) {
super.onProgressUpdate(values);
progressBar.setProgress(values[0]); // This is ran on the UI thread so it is ok to update our progress bar ( a UI view ) here
}