Android:ProgressBar导致AsyncTask出现故障

时间:2014-06-06 13:34:42

标签: android android-asynctask android-progressbar

在我的活动中,我必须使用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;
}

1 个答案:

答案 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
}