رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
نحوه استفاده از تردها در اندروید (حل شد)
#1
سلام ، فرض کنید  میخوایم اعداد   1000000000  تا   9999999999 رو نشون بدیم ، یا تو یه فایل متنی بنویسم وقتی دستوراتی با این تعداد اجرا میشه برنامه در حالت عادی هنگ می کنه . تو سی شارپ برای جلوگیری از هنگیدن برنامه از ترد استفاده می کنن ، من میخوام نحوه استفاده از تردها
رو تو اندروید یاد بگیرم به همین خاطر  این مثال رو که به زبان سی شارپ هست اینجا می نویسم و از دوستان خواهشم این هست  کــه معادل یا مشابه  اندرویدی این کد رو برام بنویسین

اول یک متد  تعریف می کنم

public void creat_text()

       {
          
           long i;
          
               // Create a file to write to.
               
                   for (i = 1000000000; i < 9999999999; i++)
                   {
                       MessageBox.Show(i.ToString());


                   }
                   if (i == 9999999999)
                       MessageBox.Show("ok");

               }
           }

حالا فرضا" تو رویداد  کلیک باتن دوم به کمک ترد اون متد رو اجرا می کنم

 Thread t = new Thread(creat_text);

            t.Start();
پاسخ
تشکر شده توسط:
#2
دقیق یه همچین کدی که عرض کردم به زبان جاوا (اندروید) میخوام تا بدونم این جور موارد چطوری از هنگیدن برنامه جلوگیری میشه
پاسخ
تشکر شده توسط:
#3
new Thread(new Runnable() {
    @override
    public void run() {
        create_text();
    }
}).start();
پاسخ
تشکر شده توسط: Mehran , Eshpilen
#4
می بخشین یه سوال دیگه پیش اومد که چون مرتبط با این موضوع هست تاپیک جدید باز نکردم ، من برای نمایش عدد شمارنده (منظورم I هست ) از

log استفاده کردم چیزی نمایش داده نشد
از Toast استفاده کردم برنامه خطا داد
حتی خواستم مقدار یک Text view رو لحظه به لحظه تغییر بدم و I رو داخل اون تکست نشون بدم بازم برنامه موقع اجرا خطا داد
در حقیقت سوالم اینکه داخل متد creat_text برای اینکه لحظه به لحظه مقدار I رو نشون بدم ، باید چی کار کنم ؟
پاسخ
تشکر شده توسط:
#5
توی تردهای فرعی (بجز Main Thread) شما حق ندارین با UI کار کنید. باید توی اکتیویتی خودتون یه فیلد هندلر تعریف کنید و از اون استفاده کنید. مثال:
public class ActivityMain extends Activity {
    public static Handler handler = new Handler();
    // ...
}


// inside thread
ActivityMain.handler.post(new Runnable() {
    @override
    public void run() {
        Log.i("LOG", "I = " + i);
    }
});
پاسخ
تشکر شده توسط: Mehran
#6
خب من چه یه مقدار شک داشتم دقیق کدوم حالت منظور شما هست این دو کد رو نوشتم ، جالب اینکه هر دو اجرا شدن و خطایی اتفاق نیفتاد ولی تو هیچ کدوم I نمایش داده نمیشه ..


package com.ketabsoft.myapplication;


import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import java.math.BigInteger;



public class MainActivity extends AppCompatActivity {
   public static Handler handler = new Handler();
   public static long i=1000000000l;
   public static String Msg_i;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
      





       new Thread(new Runnable() {

           public void run() {


               create_text();

           }
       }).start();









   }


   
   public void create_text()
   {

      

       for(long i=1000000000l;i<9999999999l;i++){
        
            Msg_i=Long.toString(i);
          
           MainActivity.handler.post(new Runnable() {

               public void run() {

                   Log.i("LOG", "I = " + Msg_i);
               }
           });




       }

   }


   }
}


و این حالت



package com.ketabsoft.myapplication;

import android.content.ContentResolver;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;

import java.math.BigInteger;



public class MainActivity extends AppCompatActivity {
   public static Handler handler = new Handler();
   public static long i=1000000000l;
   public static String Msg_i;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
      





      MainActivity.handler.post(new Runnable() {

               public void run() {

                 create_text();  
                 Log.i("LOG", "I = " + Msg_i);
               }
           });









   }


   
   public void create_text()
   {

      

       for(long i=1000000000l;i<9999999999l;i++){
        
            Msg_i=Long.toString(i);
          
           




       }

   }


   }
}


پاسخ
تشکر شده توسط:
#7
نقل قول:android.support.v7.app.AppCompatActivity;
این AppCompatActivity چیه؟
از اسمش بنظر میرسه یجور اکتیویتی سبک تر باشه.
من توی SDK خودم اینطور چیزا رو نصب نکردم بخاطر اینکه حجم دانلود زیاد نشه. چند روز پیش هم به کدی برخوردم که از AppCompatActivity استفاده کرده بود، ولی خوشبختانه جاش اکتیویتی معمولی گذاشتم که ظاهرا هیچ مشکلی نداشت.
پاسخ
تشکر شده توسط: Mehran
#8
(17-09-1394، 08:07 ب.ظ)Eshpilen نوشته: این AppCompatActivity چیه؟
از اسمش بنظر میرسه یجور اکتیویتی سبک تر باشه.
من توی SDK خودم اینطور چیزا رو نصب نکردم بخاطر اینکه حجم دانلود زیاد نشه. چند روز پیش هم به کدی برخوردم که از AppCompatActivity استفاده کرده بود، ولی خوشبختانه جاش اکتیویتی معمولی گذاشتم که ظاهرا هیچ مشکلی نداشت.

سلام ،   یک پست مانده به آخرین  پست این  لینک رو بخونین
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 1 مهمان