0

こんにちは、私はAndroidアプリの初心者開発者です。私は大学の試験のためにこの仕事をしています。より多くのドキュメントを読みましたが、asynctask がサーバーから Json 文字列をダウンロードしている間、アクティビティで進行状況ダイアログを表示することに問題があり、リストビューに配置する必要があります。UI スレッドで Async タスクを呼び出しますが、スレッドは引き続き動作し、httpGet の結果を使用できません (正常に動作します)。Log.i(...) を使用してこれを理解しています UI の理由スレッドは停止せず、結果に出席しますか?? 私が間違っていることは何ですか?私を助けてください。

package my.pack;


import java.util.concurrent.ExecutionException;

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;

public class TestDialogActivity extends Activity 
{


ProgressDialog dialog;
String url = "My URL";
String result= "init";

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    DownloadJsonDataTask task = (DownloadJsonDataTask) new DownloadJsonDataTask(result).
            execute(url);   


    try {
        String ris = task.get();
    } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ExecutionException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    Log.i("GET",result);



}



public String requestInfoFromServer() {
    String request = null;
    HttpConnection http = HttpConnection.getInstance();
    http.setHttpClient(url);
    request = http.executeRequest();

    return request;
}   

private class DownloadJsonDataTask extends AsyncTask<String, Integer, String> 
{

    String Result;

    protected void onPreExecute()
    {
        dialog = new ProgressDialog(TestDialogActivity.this);
        dialog.setTitle("Download");
        dialog.setMessage("Please wait...");
        dialog.setIndeterminate(true);
        dialog.show();

    }

            public DownloadJsonDataTask(String response) {

                this.Result=response;
            }

    protected String doInBackground(String... urls) {
        String urldisplay = urls[0];

        Log.i("STRING URL:", urldisplay);

        String result = requestInfoFromServer();

        return Result; 

    }


    protected void onPostExecute(String result) {
        this.Result = result;
        dialog.dismiss();
    }
}

}
4

3 に答える 3

1

サミールマングロリヤに加えて。

task.get();メソッドが呼び出されたスレッドのブロッキング呼び出しです。したがって、メインUIスレッドで使用すると、ブロックされます。これは、smthのダウンロードに数秒かかる場合があるためです。そのため、システムはUIスレッドが長期間ブロックされていることを検出し、ANR(アプリケーションが応答しない)ポップアップでアプリを終了します。この移動結果処理をAsyncTaskのonPostExecute()に修正するには(少なくとも結果処理はこの時点で開始する必要があります。ここでホストアクティビティのメソッドを呼び出して結果を渡すことができます)。

于 2012-06-13T20:11:42.347 に答える
0

ああ、変数名では大文字と小文字が区別されるため、同じような名前の2つの異なる文字列を宣言した関数に問題があります。一方の文字列に名前を付け、もうdoInBackground(String... urls)一方の文字列にRとrという名前を付けることは完全に合法です。したがって、両方が2つの異なる文字として表示されます。一意の名前があります。ただし、これが有効な構文である間。これは論理エラーを起こしやすいです。そして、私はこれがあなたが問題に遭遇した場所だと信じています。関数呼び出しの終わりまでにのみ値を割り当てませんでした。これも有効な構文であり、宣言したときのようにnull変数を指していません。ResultresultResultresultResult空の文字列のデフォルト値を入力しました。したがって、変数がnullでないため、コンパイルされ、nullポインタエラーはスローされません。文字列データが含まれていなくても、コンパイラに関する限り、ポインタはメモリ内の有効な場所を指しています。文字列の内容をチェックするのではなく、渡すだけです。一方、result呼び出しの終了直前にすべてのデータを割り当てる変数には、必要なすべてのデータがロードされます。それを処理するコマンドがそれ以上ないため、呼び出しが終了するまで完全に無視されます。その後、呼び出しの終了時にガベージコレクションが収集され、その変数のみを渡すように指示されていないため、データが渡されることはありません。Result1

わかる?

于 2012-06-13T20:11:29.770 に答える
0

In your doInBackground() routine, save the downloaded result in the member variable Result. Then, in onPostExecute() you will need to read Result and update your UI.

eg:

private void updateUI(String jsondata)
{
    foo = do.something.to.derive.some.data.from.jsondata.

    TextView tv = findViewById(R.id.textview1);
    tv.setText (foo);
}

private class DownloadJsonDataTask extends AsyncTask<String, Integer, String> 
{

    String Result = null;
    ...
    protected String doInBackground(String... urls) 
    {
            Result = requestInfoFromServer();
    }


    protected void onPostExecute(String result) 
    {
         dialog.dismiss();
         updateUI(Result);
     }
  }
于 2012-06-13T20:25:11.040 に答える