4

次のアクティビティに進む前に、各アクティビティでデータをサーバーに渡し、応答を返す必要がある Android アプリケーションを開発しています。インターネットが十分に高速な場合、アプリケーションは正常に動作します。しかし、速度が低下すると、適用力は閉じます。アプリケーションの強制終了につながらないように、遅いインターネット接続に対処する方法?????

ここにコードの一部があります

public void onClick(View v) {
    // TODO Auto-generated method stub
    UserFunctions userFunction = new UserFunctions();
    if(userFunction.isNetworkAvailable(getApplicationContext()))
    {
        answer="";
        for(int check1=0;check1<counter2;check1++){
            int check2=0;
            answer=answer+option4[check1]+"|";
            while(check2<counter1){
                if(edTxt[check1][check2].getText().toString().equals("")){
                    answer="";
                    break;
                }
                else{
                    answer=answer+edTxt[check1][check2].getText().toString()+"|";
                }
                check2++;       
            }   
            if(answer.equals("")){
                break;
            }
            else{
                answer=answer+"||";
            }
        }
        if(answer.equals("")){
            Toast.makeText(this, "Please fill all fields", 600).show();
        }
        else{
        userFunction.form1(surveyId,userId , quesNo, answer);
        if(total>0){
            draw(temp); 
        }
        else{
            ques_no++;
            ArrayList<NameValuePair> params = new ArrayList<NameValuePair>();  
            params.add(new BasicNameValuePair("quesNo", Integer.toString(ques_no)));
            params.add(new BasicNameValuePair("surveyId", surveyId));
            count = getJsonFromURL22(surveyCond, params);           
            j=Integer.parseInt(result);
            if(j==22)
            {
                Toast.makeText(this, "Survey Completed", 600).show();
                Intent home=new Intent(Format16.this, SurveyCompleted.class);
                UserFunctions userFunctions = new UserFunctions();
                userFunctions.full(surveyId);
                Bundle d=new Bundle();
                d.putString("userId", userId);
                home.putExtras(d);
                startActivity(home);
            }
     public String getJsonFromURL22(String url, List<NameValuePair> params){
try{
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);
    httppost.setEntity(new UrlEncodedFormEntity(params));
    HttpResponse response = httpclient.execute(httppost);
    HttpEntity entity = response.getEntity();
    is = entity.getContent();
}catch(Exception e){
    Log.e("log_tag", "Error in http connection"+e.toString());
}
//convert response to string
try{
    BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
    sb = new StringBuilder();
    sb.append(reader.readLine());

    String line="0";
    while ((line = reader.readLine()) != null) {
        sb.append(line);
    }
    is.close();
    result=sb.toString();
}catch(Exception e){
    Log.e("log_tag", "Error converting result "+e.toString());
}
return result;
}
4

5 に答える 5

3

コードを表示していないので、Android API レベル 10 以下をターゲットにしており、UI スレッドですべてのネットワークを実行しているため、恐ろしいアプリ応答なし (ANR) エラーが発生していると思います。この問題を解決する 1 つの方法は、AsyncTaskすべてのネットワーク コードをそこに移動して使用することです。正しく行われると、はすべてAsyncTaskdoInBackground()ネットワークを別のスレッドで処理し、UI の応答性を維持できるようにします。

通常、次のように機能します。

private class NetworkTask extends AsyncTask<String, Void, String> {

      @Override
      protected String doInBackground(String... params) {
           // Do all networking here, this will work away in a background thread.
           // In your case:
           // HttpResponse response = httpclient.execute(httppost);
           // Must happen here
      }      

      @Override
      protected void onPostExecute(String result) { 
         // dismiss progress dialog if any (not required, runs in UI thread)
      }

      @Override
      protected void onPreExecute() {
         // show progress dialog if any, and other initialization (not required, runs in UI thread)
      }

      @Override
      protected void onProgressUpdate(Void... values) {
// update progress, and other initialization (not required, runs in UI thread)
      }
}

を有効StrictModeにするか、API バージョン 11 以降をターゲットNetworkOnMainThreadExceptionにすると、これを実行しようとすると Android が をスローします。

于 2012-06-25T06:27:16.710 に答える
1

インターネットが十分に高速な場合、アプリケーションは正常に動作します。しかし、速度が低下すると、適用力は閉じます。

UI スレッドでネットワーク操作を行っていることを明確に示しています。Google ドキュメントによると、非同期操作がメイン スレッドで実行され、5 秒以上かかる場合、アプリケーションは強制終了ダイアログを表示しますが、これはエンド ユーザーにとって非常に不快です。 .

実際、このようなアプリケーションを最新の Android バージョン (つまり 4.0 以降) で実行しようとすると、アプリケーションを実行できなくなり、メイン スレッドで非同期操作が実行されていることが検出されるとすぐに、起動時にクラッシュします。

実行時間の長いアプリケーションを実行するにはAsyncTask、 またはを使用する必要があります。Handlers

詳細については、次のブログを参照してください。

http://android-developers.blogspot.in/2010/07/multithreading-for-performance.html

于 2012-06-25T06:30:43.477 に答える
0

アプリケーションの速度低下の原因を確認できるこのツールを確認する必要があります。ARO ツールは、この種のネットワークの問題を診断するように設計されていますhttp://developer.att.com/developer/forward.jsp?passedItemId=9700312

于 2012-06-25T10:20:45.120 に答える
0

接続タイムアウトの処理にはsetConnectionTimeoutまたはsetSoTimeoutを使用します。

HttpGet httpGet = new HttpGet(url);
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
// The default value is zero, that means the timeout is not used. 
int timeoutConnection = 3000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT) 
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 5000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);

AsyncTaskまたはHandlerまたはHandlerThreadまたは runOnUiThreadを使用して、サーバーからデータを取得します (バックグラウンドで長時間実行されるタスクを実行するため)。

于 2012-06-25T06:27:03.793 に答える
0

これは、強制終了の問題ではなく、ANR の問題である必要があります。

StrictMode を使用すると、誤ってメイン スレッドを実行している可能性がある、ネットワークなどの潜在的に長時間実行される操作を見つけることができます。

または、プログレスバーを配置してみてください。

于 2012-06-25T06:29:37.240 に答える